Browse Source

no message

featrue/v4.5
xpz2018 4 years ago
parent
commit
d9dad15d07
26 changed files with 2091 additions and 0 deletions
  1. 1
      app.json
  2. 538
      submodel/pages/goods/create/index.js
  3. 7
      submodel/pages/goods/create/index.json
  4. 149
      submodel/pages/goods/create/index.wxml
  5. 31
      submodel/pages/goods/create/index.wxss
  6. 316
      submodel/pages/goods/detail/index.js
  7. 7
      submodel/pages/goods/detail/index.json
  8. 73
      submodel/pages/goods/detail/index.wxml
  9. 79
      submodel/pages/goods/detail/index.wxss
  10. 141
      submodel/pages/goods/fragment/index.js
  11. 15
      submodel/pages/goods/fragment/index.json
  12. 53
      submodel/pages/goods/fragment/index.wxml
  13. 0
      submodel/pages/goods/fragment/index.wxss
  14. 133
      submodel/pages/goods/goods.wxs
  15. 238
      submodel/pages/goods/index/index.js
  16. 10
      submodel/pages/goods/index/index.json
  17. 69
      submodel/pages/goods/index/index.wxml
  18. 51
      submodel/pages/goods/index/index.wxss
  19. 26
      submodel/pages/goods/product-item/index.js
  20. 6
      submodel/pages/goods/product-item/index.json
  21. 27
      submodel/pages/goods/product-item/index.wxml
  22. 49
      submodel/pages/goods/product-item/index.wxss
  23. 66
      submodel/pages/paper/index/index.js
  24. 3
      submodel/pages/paper/index/index.json
  25. 2
      submodel/pages/paper/index/index.wxml
  26. 1
      submodel/pages/paper/index/index.wxss

1
app.json

@ -72,6 +72,7 @@
"pages/purchase/detail/index", "pages/purchase/detail/index",
"pages/bidding/index/index", "pages/bidding/index/index",
"pages/bidding/detail/index", "pages/bidding/detail/index",
"pages/paper/index/index",
"pages/paper/price-index/index", "pages/paper/price-index/index",
"pages/paper/cate-list/index", "pages/paper/cate-list/index",
"pages/shop/index/index", "pages/shop/index/index",

538
submodel/pages/goods/create/index.js

@ -0,0 +1,538 @@
import {
paperCategoryList,
getProductInfo,
createProductInfo,
updateProductInfo,
getWaterRate,
getDopantRate,
getBiddingInterval
} from "../../../../api/ztb"
import regions from '../../../../const/region'
const math = require('../../../../utils/math')
const util = require('../../../../utils/util')
const event = require('../../../../utils/event.js')
const app = getApp()
Page({
/**
* 页面的初始数据
*/
data: {
safeBottom: app.globalData.safeBottom,
kg: app.globalData.kg,
height: app.globalData.safeFragmentHeight,
options: regions,
region: [440000, '', ''],
cateList: [],
dopantList: [],
waterList: [],
intervalList: [{
text: '24小时',
value: 1
}, {
text: '48小时',
value: 2
}],
videoList: [],
imgLength: 0,
fileList: [],
form: {
bidType: 1,
imgList: [],
secondCategoryId: null,
stock: null,
dopantRate: null,
waterRate: null
},
cateName: '',
dopantName: '',
waterName: '',
intervalName: '',
sumAmount: 0,
keyboard: 0,
toView: '',
focus: false,
picking: false
},
/**
* 生命周期函数--监听页面加载
*/
onLoad: function (options) {
this.setData({
['form.bidType']: options.type ? Number(options.type) : 1,
kg: app.globalData.kg,
safeBottom: app.globalData.safeBottom,
height: app.globalData.safeFragmentHeight
})
this.cascaderView = this.cascaderView || this.selectComponent('#wux-cascader')
this.pickerView = this.pickerView || this.selectComponent('#picker-view')
wx.showLoading({
title: '加载中',
mask: true
})
getDopantRate().then(result => {
var list = []
result.data.forEach((item) => {
list.push({
text: item.name,
value: item.id
})
})
this.setData({
dopantList: list
})
})
getWaterRate().then(result => {
var list = []
result.data.forEach((item) => {
list.push({
text: item.name,
value: item.id
})
})
this.setData({
waterList: list
})
})
getBiddingInterval().then(result => {
var list = []
result.data.forEach((item) => {
list.push({
text: item.name,
value: item.id
})
})
this.setData({
intervalList: list
})
})
paperCategoryList({
type: 1
}).then(result => {
var cateList = []
result.data.forEach((item) => {
cateList.push({
label: item.name,
value: item.id,
isLeaf: false,
})
})
this.setData({
cateList: cateList
})
if (!options.id) {
wx.hideLoading()
}
}).catch(err => {
//异常回调
if (!options.id) {
wx.hideLoading()
}
})
if (options.id) {
getProductInfo(options.id).then(result => {
var fileList = []
if (result.data.imgList && result.data.imgList.length) {
result.data.imgList.forEach(element => {
fileList.push({
url: element,
status: 8
})
})
}
var videoList = []
if (result.data.videoUrl) {
videoList.push({
videoUrl: result.data.videoUrl,
status: 8
})
}
var region = []
if (result.data.locDistrictId) {
region[0] = parseInt(result.data.locDistrictId / 10000) * 10000
region[1] = parseInt(result.data.locDistrictId / 100) * 100
region[2] = parseInt(result.data.locDistrictId)
}
this.data.cateName = result.data.firstCategoryName + ' ' + result.data.secondCategoryName
if (this.data.dopantList && this.data.dopantList.length) {
this.data.dopantList.forEach(element => {
if (Number(element.value) == Number(result.data.dopantRate)) {
this.data.dopantName = element.text
}
})
}
if (this.data.waterList && this.data.waterList.length) {
this.data.waterList.forEach(element => {
if (Number(element.value) == Number(result.data.waterRate)) {
this.data.waterName = element.text
}
})
}
if (result.data.biddingInterval) {
this.data.intervalList.forEach(element => {
if (Number(element.value) == Number(result.data.biddingInterval)) {
this.data.intervalName = element.text
}
})
}
if (result.data.unitPrice) {
var unitPrice = app.globalData.kg ? result.data.unitPrice : math.times(result.data.unitPrice, 1000)
} else {
var unitPrice = ''
}
var stock = app.globalData.kg ? result.data.stock : math.divide(result.data.stock, 1000)
var lowestNum = ''
if (!util.isEmpty(result.data.lowestNum)) {
lowestNum = app.globalData.kg ? result.data.lowestNum : math.divide(result.data.lowestNum, 1000)
}
this.setData({
form: result.data,
['form.unitPrice']: unitPrice,
['form.stock']: stock,
['form.lowestNum']: lowestNum,
fileList: fileList,
videoList: videoList,
region: region,
['form.areaStr']: result.data.locProvinceName + ' ' + result.data.locCityName + ' ' + result.data.locDistrictName,
cateValue: [result.data.firstCategoryId, result.data.secondCategoryId],
cateName: this.data.cateName,
dopantName: this.data.dopantName,
waterName: this.data.waterName,
imgLength: fileList.length,
intervalName: this.data.intervalName
})
if (util.isEmpty(this.data.form.areaStr)) {
this.cascaderView.getCurrentOptions(region, true)
}
this.sumAmount(null)
this.data.form['coverImgUrl'] = fileList[0].url
wx.hideLoading()
}).catch(err => {
//异常回调
wx.hideLoading()
util.showToast(err)
})
}
},
InputFocus(e) {
this.setData({
focus: true,
toView: 'textarea',
keyboard: e.detail.height
})
},
InputBlur(e) {
this.setData({
keyboard: 0,
focus: false,
toView: null
})
},
textareaFocus: function (e) {
this.setData({
focus: true,
toView: 'textarea'
})
},
onVideoChange: function (e) {
if (e.detail && e.detail.length) {
this.data.form['videoUrl'] = e.detail[0].url
}
},
onImageChange: function (e) {
if (e.detail) {
var list = []
e.detail.forEach(element => {
if (!util.isEmpty(element.url)) {
list.push(element.url)
}
})
this.data.form['imgList'] = list
this.setData({
imgLength: list.length
})
}
},
bindInput: function (e) {
if (e.target.id == 'description') {
this.setData({
['form.' + e.target.id]: e.detail.value
})
} else {
this.data.form[e.target.id] = e.detail.value
}
},
onLoadOptions: function (e) {
// /paperCategoryList 获取纸品列表
const {
value
} = e.detail
const options = [...this.data.cateList]
var typeId = parseInt(value[value.length - 1])
wx.showLoading({
title: '加载中',
mask: true
})
paperCategoryList({
type: 2,
firstCategoryId: typeId
}).then(result => {
//成功回调
var list = []
result.data.forEach((item) => {
list.push({
label: item.name,
value: item.id
})
})
options.forEach((element) => {
if (parseInt(element.value) === typeId) {
element.children = list
}
})
this.setData({
cateList: options
})
wx.hideLoading()
}).catch(err => {
//异常回调
wx.hideLoading()
})
},
showRegion: function () {
if (this.data.disabled) {
return
}
this.cascaderView.showPicker(this.data.region)
this.setData({
picking: true
})
},
onRegionInit: function (e) {
if (this.data.form.locDistrictId && e.detail.length == 3) {
this.setData({
['form.areaStr']: e.detail.map((n) => n.label).join(' ')
})
}
},
onRegionChange: function (e) {
if (e.detail && e.detail.options) {
this.setData({
['form.areaStr']: e.detail.options.map((n) => n.label).join(' '),
region: e.detail.value
})
this.data.form['locProvinceId'] = e.detail.value[0]
this.data.form['locProvinceName'] = e.detail.options[0].label
this.data.form['locCityId'] = e.detail.value[1]
this.data.form['locCityName'] = e.detail.options[1].label
this.data.form['locDistrictId'] = e.detail.value[2]
this.data.form['locDistrictName'] = e.detail.options[2].label
}
this.setData({
picking: false
})
},
showPaperPicker: function (e) {
this.setData({
visible: true,
picking: true
})
var list = [this.data.cateList[0].value]
if (!this.data.cateList[0].children) {
this.onLoadOptions({
detail: {
value: list
}
})
}
},
onCategory: function (e) {
this.setData({
picking: false
})
if (e.detail && e.detail.options) {
this.setData({
cateName: e.detail.options.map((n) => n.label).join(' '),
cateValue: e.detail.value
})
this.data.form['firstCategoryId'] = e.detail.value[0]
this.data.form['secondCategoryId'] = e.detail.value[1]
}
},
onPaperChange: function (e) {
this.setData({
picking: false
})
if (!e.detail) {
return
}
if (e.detail.type == 0) {
this.data.form['secondCategoryId'] = e.detail.value
this.data.form['firstCategoryId'] = e.detail.value
this.setData({
cateName: e.detail.text
})
} else if (e.detail.type == 1) {
this.data.form['dopantRate'] = e.detail.value
this.setData({
dopantName: e.detail.text
})
} else if (e.detail.type == 2) {
this.data.form['waterRate'] = e.detail.value
this.setData({
waterName: e.detail.text
})
} else if (e.detail.type == 3) {
this.data.form['biddingInterval'] = e.detail.value
this.setData({
intervalName: e.detail.text
})
}
},
bindinput: function (e) {
this.data.form[e.target.id] = e.detail.value
},
sumAmount: function (e) {
if (Number(this.data.form.unitPrice) > 0 && parseInt(this.data.form.stock)) {
this.setData({
sumAmount: math.times(this.data.form.unitPrice, this.data.form.stock)
})
}
},
templatDescription: function () {
},
showRadioPicker: function (e) {
if (e.currentTarget.id == 'dopantRate') {
this.pickerView.showPicker(this.data.dopantList, this.data.form.dopantRate, 1)
} else if (e.currentTarget.id == 'waterRate') {
this.pickerView.showPicker(this.data.waterList, this.data.form.waterRate, 2)
} else if (e.currentTarget.id == 'biddingInterval') {
this.pickerView.showPicker(this.data.intervalList, this.data.form.biddingInterval, 3)
}
this.setData({
picking: true
})
},
submitForm: function () {
if (util.isEmpty(this.data.form.secondCategoryId)) {
util.showToast('请选择废纸品类')
return
}
if (this.data.form.bidType == 2) {
if (util.isEmpty(this.data.form.unitPrice)) {
if (this.data.form.bidType == 1) {
util.showToast('请输入商品单价')
} else {
util.showToast('请输入起拍单价')
}
return
}
if (app.globalData.kg) {
if (parseFloat(this.data.form.unitPrice) > 100) {
if (this.data.form.bidType == 1) {
util.showToast('请检查您输入的商品单价是否合理')
} else {
util.showToast('请检查您输入的起拍单价是否合理')
}
return
}
} else {
if (parseFloat(this.data.form.unitPrice) < 100) {
if (this.data.form.bidType == 1) {
util.showToast('请检查您输入的商品单价是否合理')
} else {
util.showToast('请检查您输入的起拍单价是否合理')
}
return
}
}
}
if (util.isEmpty(this.data.form.stock)) {
util.showToast('请输入库存')
return
}
if (util.isEmpty(this.data.form.biddingInterval) && this.data.form.bidType == 2) {
util.showToast('请选择竞价有效时')
return
}
if (util.isEmpty(this.data.form.dopantRate)) {
util.showToast('请选择含杂比例')
return
}
if (util.isEmpty(this.data.form.waterRate)) {
util.showToast('请选择湿水比例')
return
}
if (util.isEmpty(this.data.form.locDistrictId)) {
util.showToast('请选择店铺所在区域')
return
}
if (util.isEmpty(this.data.form.locDetails)) {
util.showToast('请输入店铺详细地址')
return
}
if (this.data.form.imgList.length < 2) {
util.showToast('请至少上传2张商品图片')
return
}
this.data.form['coverImgUrl'] = this.data.form.imgList[0]
if (util.isEmpty(this.data.form.description)) {
util.showToast('请输入商品描述')
return
}
this.setData({
requesting: true
})
wx.showLoading({
title: '加载中',
mask: true
})
if (!app.globalData.kg) {
if (this.data.form.unitPrice > 0) {
this.data.form.unitPrice = math.divide(this.data.form.unitPrice, 1000)
} else {
this.data.form.unitPrice = ''
}
this.data.form.stock = math.times(this.data.form.stock, 1000)
if (!util.isEmpty(this.data.form.lowestNum)) {
this.data.form.lowestNum = math.times(this.data.form.lowestNum, 1000)
}
}
if (this.data.form.productId) {
updateProductInfo(this.data.form).then(result => {
wx.hideLoading()
event.emit('EventMessage', {
what: 102,
desc: 'GoodsCreate'
})
util.showBackToast('商品发布成功!')
}).catch(err => {
//异常回调
wx.hideLoading()
this.setData({
requesting: false
})
util.showToast(err)
})
} else {
createProductInfo(this.data.form).then(result => {
wx.hideLoading()
util.showBackToast('商品创建成功!')
}).catch(err => {
wx.hideLoading()
this.setData({
requesting: false
})
util.showToast(err)
})
}
}
})

7
submodel/pages/goods/create/index.json

@ -0,0 +1,7 @@
{
"usingComponents": {
"select-view": "/components/select-view/index",
"wux-cascader": "/components/cascader/index",
"wux-uploader": "/components/uploader/index"
}
}

149
submodel/pages/goods/create/index.wxml

@ -0,0 +1,149 @@
<wxs module="goods" src="../../goods/goods.wxs"></wxs>
<cu-custom bgColor="bg-white" isBack="{{true}}">
<view slot="content">{{form.bidType == 1 ? '我要卖货' : '发布竞价'}}</view>
</cu-custom>
<scroll-view scroll-y="true" style="height: {{height}}rpx;" scroll-into-view="{{toView}}">
<view style="display:{{!focus ? 'block' : 'none'}}">
<view class="cu-bar bg-white margin-top">
<view class="action text-bold" style="color:#333333">{{!disabled?'商品图片(至少上传2张)':'商品图片'}}</view>
<view class="action text-sg">{{imgLength}}{{!disabled? '/6':'张'}}</view>
</view>
<wux-uploader count="6" fileList="{{fileList}}" bindcustomevent="onImageChange"></wux-uploader>
</view>
<view style="display:{{!focus ? 'block' : 'none'}}">
<view class="cu-bar bg-white margin-top">
<view class="action text-bold" style="color:#333333">上传视频(选填)</view>
<view class="action text-sg">支持MP4格式</view>
</view>
<wux-uploader count="1" fileList="{{videoList}}" type="{{'video'}}" bindcustomevent="onVideoChange"></wux-uploader>
</view>
<view class="cu-list menu no-card sm-border margin-top">
<view id="operation" class="cu-item" bindtap="showPaperPicker">
<view class="flex flex-justify content cu-item arrow">
<view class="text-sg" style="min-width:170rpx">废纸品类:</view>
<view class="flex" style="text-align:left">
<view class="text-sg {{cateName?'text-blue':'input-grey'}}">{{cateName||'请选择废纸品类'}}</view>
</view>
</view>
<text class="cuIcon-right text-gray" wx:if="{{!flag}}" style="font-size:32rpx;padding-top:2rpx"></text>
</view>
<view id="price" class="cu-item" wx:if="{{form.bidType == 1}}">
<view class="flex flex-justify content cu-item arrow">
<view class="text-sg" style="min-width:170rpx">商品单价({{kg? '元/KG' : '元/吨'}}):</view>
<input id="unitPrice" maxlength="8" type="{{kg? 'digit' : 'number'}}" class="cate-input"
placeholder-style="color:#aaa" value="{{form.unitPrice||''}}" placeholder="点击输入商品单价" bindinput="bindInput"
bindblur="sumAmount" style="flex: 1"/>
</view>
</view>
<view id="price" class="cu-item" wx:if="{{form.bidType == 2}}">
<view class="flex flex-justify content cu-item arrow">
<view class="text-sg" style="min-width:170rpx">起拍单价({{kg? '元/KG' : '元/吨'}}):</view>
<input id="unitPrice" maxlength="8" type="{{kg? 'digit' : 'number'}}" class="cate-input"
placeholder-style="color:#aaa" value="{{form.unitPrice||''}}" placeholder="点击输入起拍单价" bindinput="bindInput"
bindblur="sumAmount" style="flex: 1"/>
</view>
</view>
<view id="weight" class="cu-item">
<view class="flex flex-justify content cu-item arrow">
<view class="text-sg" style="min-width:170rpx">库存重量({{ kg? 'KG' : '吨'}}):</view>
<input id="stock" maxlength="8" type="{{kg? 'number' : 'digit'}}" class="cate-input"
placeholder-style="color:#aaa;" value="{{form.stock||''}}" placeholder="点击输入库存重量" bindinput="bindInput"
bindblur="sumAmount" style="flex: 1"/>
</view>
</view>
<view id="price" class="cu-item" wx:if="{{form.bidType == 1}}">
<view class="flex flex-justify content cu-item arrow">
<view class="text-sg" style="min-width:170rpx">最少起订重量({{ kg? 'KG' : '吨'}}):</view>
<input id="lowestNum" maxlength="8" type="{{kg? 'number' : 'digit'}}" class="cate-input"
placeholder-style="color:#aaa" value="{{form.lowestNum||''}}" placeholder="点击输入起订重量" bindinput="bindInput" style="flex: 1"/>
</view>
</view>
<view id="biddingInterval" class="cu-item" bindtap="showRadioPicker" wx:if="{{form.bidType == 2}}">
<view class="flex flex-justify content cu-item arrow">
<view class="text-sg" style="min-width:170rpx">竞价有效时:</view>
<view class="flex" style="text-align:left">
<view class="text-sg {{intervalName?'text-blue':'input-grey'}}">{{intervalName||'请选择竞价有效时'}}</view>
</view>
</view>
<text class="cuIcon-right text-gray" wx:if="{{!flag}}" style="font-size:32rpx;padding-top:2rpx"></text>
</view>
<view id="dopantRate" class="cu-item" bindtap="showRadioPicker">
<view class="flex flex-justify content cu-item arrow">
<view class="text-sg" style="min-width:170rpx">含杂比例:</view>
<view class="flex" style="text-align:left">
<view class="text-sg {{dopantName?'text-blue':'input-grey'}}">{{dopantName||'请选择含杂比例'}}</view>
</view>
</view>
<text class="cuIcon-right text-gray" wx:if="{{!flag}}" style="font-size:32rpx;padding-top:2rpx"></text>
</view>
<view id="waterRate" class="cu-item" bindtap="showRadioPicker">
<view class="flex flex-justify content cu-item arrow">
<view class="text-sg" style="min-width:170rpx">湿水比例:</view>
<view class="flex" style="text-align:left">
<view class="text-sg {{waterName?'text-blue':'input-grey'}}">{{waterName||'请选择湿水比例'}}</view>
</view>
</view>
<text class="cuIcon-right text-gray" wx:if="{{!flag}}" style="font-size:32rpx;padding-top:2rpx"></text>
</view>
<view class="cu-item" bindtap="showRegion">
<view class="flex flex-justify content cu-item arrow">
<view class="text-sg" style="min-width:170rpx">所在地区:</view>
<view class="flex" style="text-align:left">
<view class="text-sg {{form.areaStr?'text-blue':'input-grey'}}">{{form.areaStr||'请选择所在地区'}}</view>
</view>
</view>
<text class="cuIcon-right text-gray" wx:if="{{!flag}}" style="font-size:32rpx;padding-top:2rpx"></text>
</view>
<view class="cu-form-group">
<view class="title">详细地址:</view>
<input id="locDetails" disabled="{{disabled}}" placeholder-style="color:#aaa" placeholder="请输入店铺详细地址"
value="{{form.locDetails}}" bindinput="bindInput" style="flex: 1"></input>
</view>
<view class="cu-bar bg-white margin-top flex flex-justify">
<view class="action" style="color:#333333">商品描述:</view>
<view class="action" bindtap="templatDescription">
<text class="cuIcon-sort text-gray" style="font-size:40rpx;margin-right:8rpx;padding-top:2rpx"></text>
<view style="color:#999999;font-size:30rpx;">选择模板</view>
</view>
</view>
<view class="bg-white">
<view class="textarea" wx:if="{{picking || !focus}}" bindtap="textareaFocus">
{{form.description.length?form.description:'点击输入商品描述,最多100字'}}</view>
<textarea wx:else id="description" maxlength="100" value="{{form.description}}" bindfocus="InputFocus"
bindblur="InputBlur" class="textarea" cursor-spacing="40" show-confirm-bar="{{false}}"
adjust-position="{{true}}" focus="{{focus}}" bindinput="bindInput" placeholder="点击输入备注,最多100字"
placeholder-style="color:#aaa"></textarea>
</view>
<view style="height:{{keyboard}}px"></view>
<!-- <view class="cu-bar bg-white margin-top flex flex-justify" wx:if="{{form.bidType == 1}}">
<view class="action" style="color:#333333">交易规则:</view>
</view>
<view class="bg-white" wx:if="{{form.bidType == 1}}">
<view class="textarea"></view>
</view>
<view class="cu-bar bg-white margin-top flex flex-justify" wx:if="{{form.bidType == 2}}">
<view class="action" style="color:#333333">竞价规则:</view>
</view>
<view class="bg-white" wx:if="{{form.bidType == 2}}">
<view class="textarea"></view>
</view> -->
</view>
</scroll-view>
<view style="height:{{136 + safeBottom}}rpx"></view>
<view class="cu-bar bg-white shadow foot flex flex-justify" style="height:{{120 + safeBottom}}rpx;padding: 32rpx 32rpx {{safeBottom + 32}}rpx 32rpx;">
<view>
<text class="text-gray text-sg">预估总价:</text>
<text class="text-black text-bold" style="font-size: 44rpx">{{goods.formateAmount(sumAmount)}}</text>
<text class="text-gray text-sg" style="margin-left:8rpx">元</text>
</view>
<button class="cu-btn offer-btn" disabled="{{requesting}}" bindtap="submitForm">确认</button>
</view>
<select-view id="picker-view" bindcustomevent="onPaperChange"></select-view>
<wux-cascader id="wux-cascader" value="{{region}}" options="{{ options }}" bind:close="onRegionChange" />
<wux-cascader visible="{{ visible }}" controlled value="{{ cateValue }}" options="{{ cateList }}"
bind:close="onCategory" bind:load="onLoadOptions" />

31
submodel/pages/goods/create/index.wxss

@ -0,0 +1,31 @@
.margin-top {
margin-top: 18rpx;
}
.cate-input {
font-size: 30rpx;
text-align: right;
}
.textarea{
width:100%;
height:80px;
padding:0px 30rpx;
font-size: 14px;
}
.bg-blue{
color: #FFFFFF;
background-color: #008AFF;
}
.offer-btn {
width: 250rpx;
height: 90rpx;
background: linear-gradient(312deg, rgba(38, 125, 214, 1) 0%, rgba(0, 138, 255, 1) 100%);
box-shadow: 0px 10px 13px -8px rgba(35, 126, 217, 0.53);
border-radius: 23px;
color: white;
font-size: 32rpx;
margin-left: 32rpx;
}

316
submodel/pages/goods/detail/index.js

@ -0,0 +1,316 @@
import { getProductInfo } from "../../../../api/ztb"
const util = require('../../../../utils/util')
const math = require('../../../../utils/math')
const event = require('../../../../utils/event')
const app = getApp()
Page({
/**
* 页面的初始数据
*/
data: {
backStr: '返回',
orderInfo: null,
matchTag: null,
sukList: [],
imgList: [],
form: {
productId: null,
skuId: null,
number: 1,
unitPrice: 0
},
amount: null,
safeBottom: false,
imageHeight: 0,
visible: false,
videoUrl: null
},
/**
* 生命周期函数--监听页面加载
*/
onLoad: function (options) {
if (getCurrentPages().length == 1) {
this.setData({
backStr: '首页'
})
}
this.setData({
imageHeight: math.divide(math.times(750, 9), 16),
safeBottom: app.globalData.safeBottom
})
event.on('EventMessage', this, this.onEvent)
if (options.id) {
wx.showLoading({
title: '加载中',
mask: true
})
getProductInfo(options.id).then(result => {
wx.hideLoading()
var vurl = null
var imgList = []
if (result.data.videoUrl) {
vurl = result.data.videoUrl
imgList = result.data.imgList
imgList.unshift(vurl)
this.videoContext = wx.createVideoContext('video')
} else {
imgList = result.data.imgList
}
this.setData({
['form.productId']: options.id,
orderInfo: result.data,
videoUrl: vurl,
imgList: imgList
})
}).catch(err => {
//异常回调
wx.hideLoading()
util.showToast(err)
})
}
},
isVideoUrl: function (url) {
if (url && url.indexOf('.mp4') >= 0) {
return true
}
return false
},
// 事件处理
onEvent: function (message) {
console.log('mall>>order>>onEvent', message)
if (message.what == 1) {
} else if (message.what == 10) {
wx.navigateBack()
}
},
videoTap: function () {
this.setData({
visible: true,
})
if (this.videoContext) {
this.videoContext.play()
}
},
onClose: function () {
this.setData({
visible: false,
})
if (this.videoContext) {
this.videoContext.pause()
}
},
bindended: function () {
this.videoContext.exitFullScreen()
this.setData({
visible: false
})
},
// 图片查看
viewImage: function (e) {
if (e.currentTarget.dataset.url.indexOf('.mp4') >= 0) {
return
}
var imgList = []
for (let index = 0; index < this.data.imgList.length; index++) {
if (this.data.imgList[index].indexOf('.mp4') >= 0) {
continue
}
imgList.push(this.data.imgList[index])
}
wx.previewImage({
urls: imgList,
current: e.currentTarget.dataset.url
});
},
// 根据
checkDisableTag: function (sukId, match, element) {
match[sukId] = element.id
for (let index = 0; index < this.data.orderInfo.skuList.length; index++) {
const item = this.data.orderInfo.skuList[index];
if (this.checkSkuPrice(match, item)) {
delete match[sukId]
return false
}
}
delete match[sukId]
return true
},
// tag 点击事件
tagClick: function (e) {
this.data.matchTag = null
var sukId = e.currentTarget.dataset.suk // 对应的是一级列表的Id
var id = e.currentTarget.dataset.index // 对应的是二级列表的Id,相应是有价格计算的
//------------------------------sukList-------------------------------------------
// 检查是否需要跟新,或者修改,跟新sukList;
var push_flag = true
for (let index = 0; index < this.data.sukList.length; index++) {
const element = this.data.sukList[index];
if (element.skuId == sukId) {
this.data.sukList[index].id = id
push_flag = false
break
}
}
if (push_flag) {
this.data.sukList.push({
skuId: sukId,
id: id
})
}
//------------------------------attributeList-------------------------------------------
var match = {}
for (let index = 0; index < this.data.sukList.length; index++) {
const element = this.data.sukList[index];
match[element.skuId] = element.id
}
var attributeList = this.data.orderInfo.attributeList
for (let i = 0; i < attributeList.length; i++) {
for (let k = 0; k < attributeList[i].values.length; k++) {
const element = attributeList[i].values[k];
// 点击的列判断 对应的是一级列表,肯定是可以点击的
if (attributeList[i].id == sukId) {
element.select = false
if (element.id == id) {
element.select = true
}
} else {
// 如果其余的规格没有价格的,进行处理;无法点击
element.disabled = this.checkDisableTag(attributeList[i].id, match, element)
}
}
}
this.setData({
['orderInfo.attributeList']: attributeList,
amount: null
})
//------------------------------matchTag-------------------------------------------
if (this.data.sukList.length == this.data.orderInfo.attributeList.length) {
this.data.matchTag = {}
for (let index = 0; index < this.data.sukList.length; index++) {
const element = this.data.sukList[index];
this.data.matchTag[element.skuId] = element.id
}
this.onNumChange(null)
}
},
// 根据所有选择的规格校验获取价格
checkSkuPrice: function (tag, element) {
if (!tag) {
return false
}
for (var key in tag) {
if (element.price <= 0 || tag[key] != element[key]) {
return false
}
}
return true
},
// 数量变化的函数监听
onNumChange: function (e) {
if (e) {
this.setData({
['form.number']: e.detail.value
})
// 如果查询到了价格,进行价格计算
if (this.data.form.unitPrice) {
this.setData({
amount: float.accMul(this.data.form.unitPrice, this.data.form.number)
})
}
} else if (this.data.sukList.length == this.data.orderInfo.attributeList.length) {
// 根据规格,克重,以及其他筛选价格
for (let index = 0; index < this.data.orderInfo.skuList.length; index++) {
const element = this.data.orderInfo.skuList[index];
if (this.checkSkuPrice(this.data.matchTag, element)) {
this.data.form.unitPrice = Number(element.price)
this.data.form.monthPrice = Number(element.groupMonthPrice)
this.data.form.stockNumber = Number(element.stockNumber)
// 如果当前的数量大于所选规格的库存数量,那么就设置成库存数量;
if (this.data.form.number > this.data.form.stockNumber) {
this.data.form.number = Number(element.stockNumber)
}
this.data.form.dividePrice = Number(element.dividePrice)
this.data.form.skuId = element.id
// console.log(element)
break
}
}
// 如果查询到了价格,进行价格计算
if (this.data.form.unitPrice) {
this.setData({
['form.number']: this.data.form.number,
['form.unitPrice']: this.data.form.unitPrice,
['form.stockNumber']: this.data.form.stockNumber,
amount: float.accMul(this.data.form.unitPrice, this.data.form.number)
})
}
}
},
// 进入支付流程
offerProject: function (e) {
var attributeList = this.data.orderInfo.attributeList
for (let i = 0; i < attributeList.length; i++) {
var toast = '请选择' + attributeList[i].name
for (let k = 0; k < attributeList[i].values.length; k++) {
const element = attributeList[i].values[k];
if (element.select) {
toast = ''
break
}
}
if (!util.isEmpty(toast)) {
util.showToast(toast)
return
}
}
if (this.data.form.number <= 0) {
util.showToast('请输入购买数量,必选大于0')
return
}
if (this.data.form.stockNumber <= 0) {
util.showToast('暂无库存,请选择其他规格类型')
return
}
this.data.form.summary = this.data.orderInfo.summary
this.data.form.sellMode = this.data.orderInfo.sellMode
this.data.form.name = this.data.orderInfo.name
this.data.form.outline = this.data.orderInfo.outline
this.data.form.litimgUrl = this.data.orderInfo.litimgUrl
this.data.form.unit = this.data.orderInfo.unit
wx.navigateTo({
url: '/pages/mall/order-offer/index?json=' + JSON.stringify(this.data.form)
})
},
onShareAppMessage: function () {
return {
title: this.data.orderInfo.name,
path: '/pages/mall/order-info/index?id=' + this.data.orderInfo.id,
imageUrl: this.data.orderInfo.litimgUrl,
success: function (res) {}
}
},
// 分享至朋友圈
onShareTimeline(res) {
return {
title: this.data.orderInfo.name,
path: '/pages/mall/order-info/index?id=' + this.data.orderInfo.id,
imageUrl: this.data.orderInfo.litimgUrl,
success: function (res) {}
}
},
// event的unregister
onUnload: function () {
event.remove('EventMessage', this)
if (getCurrentPages().length == 1) {
this.toHome()
}
},
// 返回到主页
toHome() {
wx.reLaunch({
url: '/pages/mall/shops/index',
})
}
})

7
submodel/pages/goods/detail/index.json

@ -0,0 +1,7 @@
{
"usingComponents": {
"wux-button": "/components/button/index",
"wux-input-number": "/components/input-number/index",
"wux-landscape": "/components/landscape/index"
}
}

73
submodel/pages/goods/detail/index.wxml

@ -0,0 +1,73 @@
<wxs module="goods" src="../../goods/goods.wxs"></wxs>
<cu-custom bgColor="bg-white" isBack="{{true}}">
<view slot="content" style="color:black;font-size:36rpx">商品详情</view>
</cu-custom>
<view wx:if="{{orderInfo}}">
<swiper class="screen-swiper square-dot" style="min-height:{{imageHeight}}rpx" indicator-dots="true" indicator-color="#FFFFFF" indicator-active-color="#008AFF">
<swiper-item wx:for="{{imgList}}" wx:key="index">
<view wx:if="{{goods.isVideoUrl(item)}}">
<view class="video-cnt">
<video src="{{item}}" style="width:100%;min-height:{{imageHeight}}rpx" show-center-play-btn="{{false}}" controls="{{false}}"/>
</view>
<text class="play-btn cuIcon-video text-white" style="font-size:80rpx" catchtap="videoTap" wx:if="{{!visible}}"></text>
</view>
<view wx:else bindtap="viewImage" style="width:100%;height:100%" data-url="{{item}}">
<image src="{{item}}" mode="aspectFill"></image>
</view>
</swiper-item>
</swiper>
<view class="bg-white flex flex-justify" style="padding:24rpx 32rpx">
<view class="flex flex-center">
<view class="detail-price">¥{{form.unitPrice || orderInfo.price}}</view>
<view class="text-gray" style="font-size:24rpx;margin-left:48rpx">库存:{{form.stockNumber >= 0 ? form.stockNumber : orderInfo.stockNumber}}{{orderInfo.unit}}</view>
</view>
<view class="text-gray" style="font-size:24rpx">{{orderInfo.viewNum}} 浏览</view>
</view>
<view class="bg-white text-name" style="padding:0rpx 32rpx">{{orderInfo.name}}</view>
<view class="bg-white">
<view style="height:1px;width:100%;background-color:#F3F3F3;margin-left:32rpx"></view>
</view>
<view class="bg-white flex flex-justify" style="height:100rpx;;padding: 0rpx 32rpx">
<view class="text-gray" style="font-size:28rpx">购买数量</view>
<wux-input-number value="{{form.number}}" controlled="{{true}}" disabled="{{false}}" color="stable" min="{{goods.minNumber(orderInfo, 1)}}" max="{{form.stockNumber||orderInfo.stockNumber}}" bind:change="onNumChange" />
</view>
<view class="bg-white" style="padding:32rpx;margin-top:32rpx">
<view class="text-black" style="font-size:32rpx">商品描述</view>
<view class="text-gray" style="font-size:28rpx;margin-top:32rpx">{{orderInfo.description}}</view>
</view>
<view class="bg-white">
<view style="height:1px;width:100%;background-color:#F3F3F3;margin-left:32rpx"></view>
</view>
<view class="booking-tool" style="bottom:{{280 + safeBottom}}rpx">
<view class="roder-add flex flex-center">
<button open-type="share" style="background-color: #fff;border-radius: 0;padding-left: 0px;padding-right: 0px;height:32px">
<image style="width:40rpx;height:40rpx;margin-bottom:3px" src="/assets/image/icon_share.png"></image>
</button>
</view>
</view>
<view style="height:{{136 + safeBottom}}rpx;"></view>
<view class="cu-bar bg-white shadow foot flex flex-justify" style="height:{{120 + safeBottom}}rpx;padding:32rpx 32rpx {{safeBottom}}rpx 32rpx">
<button class="flex flex-column" open-type="contact" style="background-color: #fff;border-radius: 0;margin-left:-20rpx">
<image style="width:60rpx;height:60rpx" src="/assets/image/icon_wechat.svg"></image>
<view style="font-size:28rpx;line-height: 24rpx">客服</view>
</button>
<view class="flex align-end">
<view wx:if="{{amount}}">
<text class="text-black" style="font-size:32rpx">合计:</text>
<text class="text-blue" style="font-size:32rpx">¥{{amount}}</text>
</view>
<button wx:if="{{token}}" class="cu-btn offer-btn" bindtap="offerProject">立即购买</button>
<button wx:else class="cu-btn offer-btn" open-type="getPhoneNumber" bindgetphonenumber="onGotPhoneNumber">立即购买</button>
</view>
</view>
</view>
<wux-landscape visible="{{ visible }}" bind:close="onClose">
<video id="video" src="{{videoUrl}}" style="width:750rpx;min-height:{{imageHeight}}rpx" show-center-play-btn="{{false}}" bindended="bindended" />
</wux-landscape>

79
submodel/pages/goods/detail/index.wxss

@ -0,0 +1,79 @@
.margin-top {
margin-top: 18rpx;
}
.detail-price {
font-size: 32rpx;
font-family: DINAlternate-Bold, DINAlternate;
font-weight: bold;
color: rgba(255, 66, 43, 1);
line-height: 20px;
}
.text-name {
font-size: 32rpx;
font-family: PingFang-SC-Medium, PingFang-SC;
font-weight: 500;
color: rgba(51, 51, 51, 1);
line-height: 22px;
}
.offer-btn {
width: 150px;
height: 45px;
background: linear-gradient(312deg, rgba(38, 125, 214, 1) 0%, rgba(0, 138, 255, 1) 100%);
box-shadow: 0px 10px 13px -8px rgba(35, 126, 217, 0.53);
border-radius: 23px;
color: white;
font-size: 32rpx;
margin-left: 32rpx;
}
button::after {
border: none;
}
.booking-tool {
width: calc(100% - 20px);
background-color: #fff;
position: fixed;
bottom: 150px;
left: 25px;
}
.roder-add {
display: flex;
justify-content: center;
align-items: center;
width: 40px;
height: 40px;
background-color: #fff;
border-radius: 20px;
position: absolute;
top: 24px;
right: 24px;
box-shadow: 0px 3px 6px rgba(0, 0, 0, 0.16);
}
.swiper-cnt {
display: flex;
flex-direction: column;
width: 100%;
position: relative;
}
.video-cnt {
position: absolute;
top: 0;
left: 0;
z-index: -1 !important;
width: 100%;
height: 100%;
}
.play-btn {
position: absolute;
top: 150rpx;
left: 342rpx;
z-index: 100;
}

141
submodel/pages/goods/fragment/index.js

@ -0,0 +1,141 @@
import { paperCategoryList, getMiniProxyList } from "../../../../api/ztb"
const app = getApp()
const statusList = [1, 2]
Component({
options: {
addGlobalClass: true,
multipleSlots: true
},
/**
* 页面的初始数据
*/
data: {
height: app.globalData.fragmentHeight - 210,
CustomBar: app.globalData.CustomBar,
kg: app.globalData.kg,
loading: true,
requesting: false,
finished: false,
cateList: [],
cateScroll: false,
tabiList: [],
pageIndex: 0,
top: 0,
orderList: [],
form: {
firstCategoryId: '',
bidType: statusList[0],
pageNum: 1,
pageSize:15
},
},
methods: {
onRestart: function(){
if (!this.data.firstShow) {
this.setData({ height: app.globalData.fragmentHeight - 210, kg: app.globalData.kg })
this.fetchCateList()
this.fetchGoodsList()
}
this.data.firstShow = true
},
fetchCateList: function(){
paperCategoryList({ type: 1 }).then(result => {
var tabList = ['全部']
var size = 0
for (let index = 0; index < result.data.length; index++) {
tabList.push(result.data[index].name)
size += result.data[index].name.length
}
this.data.cateList = result.data
this.setData({ tabiList: tabList, cateScroll: size > 14 })
})
},
onCategoryChange: function ({detail}) {
if(this.data.pageIndex == Number(detail.index)){
return
}
this.data.pageIndex = Number(detail.index)
if(this.data.pageIndex == 0){
this.data.form.firstCategoryId = ''
} else {
this.data.form.firstCategoryId = this.data.cateList[this.data.pageIndex - 1].id
}
this.onRefreshList()
},
onTabChange: function (e) {
if (this.data.form.bidType == Number(e.currentTarget.dataset.index)) {
return
}
var tabIndex = Number(e.currentTarget.dataset.index)
// this.data.form.bidType = statusList[this.data.tabIndex]
this.data.form.firstCategoryId = ''
this.setData({ pageIndex: 0, ['form.bidType']: tabIndex })
this.onRefreshList()
},
// 下拉刷新...
onRefreshList: function () {
if (this.data.requesting) {
return
}
this.setData({
orderList: [],
['form.pageNum']: 1,
loading: true,
finished: false
})
this.fetchGoodsList()
},
// 获取特价列表
fetchGoodsList: function () {
if (this.data.requesting || this.data.finished) {
return
}
if (this.data.loading) {
this.data.requesting = true
} else {
this.setData({ requesting: true })
}
getMiniProxyList(this.data.form).then(result => {
if (result.data.records.length) {
var respList = result.data.records
let nowList = `orderList[${this.data.orderList.length}]`
var num = result.data.current
var finished = result.data.current >= result.data.pages
if(this.data.form.pageNum == 1){
this.setData({
[nowList]: respList,
total: result.data.total,
['form.pageNum']: (num + 1),
top: 0,
finished,
requesting: false,
loading: false
})
} else {
this.setData({
[nowList]: respList,
total: result.data.total,
['form.pageNum']: (num + 1),
finished,
requesting: false,
loading: false
})
}
} else {
this.setData({ finished: true, requesting: false, loading: false })
}
}).catch(err => {
this.setData({ requesting: false, finished: true, loading: false })
})
},
lookItem: function (e) {
var item = this.data.orderList[e.currentTarget.dataset.page][e.currentTarget.dataset.index]
wx.navigateTo({ url: '/pages/mall/detail/index?id=' + item.id })
},
offerGood: function(e){
var item = this.data.orderList[e.currentTarget.dataset.page][e.currentTarget.dataset.index]
wx.navigateTo({ url: '/pages/mall/detail/index?id=' + item.id })
}
}
})

15
submodel/pages/goods/fragment/index.json

@ -0,0 +1,15 @@
{
"usingComponents": {
"wux-skeleton": "/components/skeleton/index",
"wux-skeleton-avatar": "/components/skeleton-avatar/index",
"wux-skeleton-paragraph": "/components/skeleton-paragraph/index",
"wux-row": "/components/row/index",
"wux-col": "/components/col/index",
"refresh-view": "/components/refresher/index",
"wux-button": "/components/button/index",
"wux-tabi": "/components/tabi/index",
"wux-image": "/components/image/index",
"wux-divider": "/components/divider/index",
"product-item": "/pages/goods/product-item/index"
}
}

53
submodel/pages/goods/fragment/index.wxml

@ -0,0 +1,53 @@
<wxs module="formate" src="../../../../pages/formate.wxs"></wxs>
<view class="flex bg-white" style="height:120rpx;padding:12rpx 12rpx 0rpx 12rpx;border-bottom: 2rpx solid #eee">
<view data-index="1" class="flex flex-center flex-column" style="flex:1;" bindtap="onTabChange">
<view class="text-bold" style="font-size:36rpx;color:{{form.bidType == 1 ? '#008AFF' : '#333'}}">一口价专区</view>
<view style="font-size:24rpx;color:{{form.bidType == 1 ? '#008AFF' : '#999'}};margin-top:8rpx">担保交易 支持退货</view>
<view style="width:80rpx;height:6rpx;background-color:#008AFF;margin-top:12rpx;visibility:{{form.bidType == 1 ? 'visible' : 'hidden'}}"></view>
</view>
<view data-index="2" class="flex flex-center flex-column" style="flex:1;" bindtap="onTabChange">
<view class="text-bold" style="font-size:36rpx;color:{{form.bidType == 2 ? '#008AFF' : '#333'}}">特价专区</view>
<view style="font-size:24rpx;color:{{form.bidType == 2 ? '#008AFF' : '#999'}};margin-top:8rpx">稀有资源 限时特价</view>
<view style="width:80rpx;height:6rpx;background-color:#008AFF;margin-top:12rpx;visibility:{{form.bidType == 2 ? 'visible' : 'hidden'}}"></view>
</view>
</view>
<view class="bg-white" style="height:90rpx;border-bottom: 2rpx solid #eee">
<wux-tabi scroll="{{cateScroll}}" tab-data="{{tabiList}}" tab-index="{{pageIndex}}" bind:change="onCategoryChange"></wux-tabi>
</view>
<refresh-view bind:refresh="onRefreshList" height="{{height}}" triggered="{{requesting}}" scrollTop="{{top}}" bind:scrolltolower="fetchGoodsList">
<view class="bg-white list-empty" style="height:{{ height }}rpx" wx:if="{{!orderList.length}}">
<view class="load-spinner text-gray" style="margin-bottom:24px" wx:if="{{loading}}" />
<image class="img-empty" src="/assets/image/list_empty.png" wx:else></image>
<view class="text-empty">
<text wx:if="{{loading}}">正在加载</text>
<view wx:else>
<view wx:if="{{form.bidType == 2}}">
<view>特价商品发布中,</view>
<view>先去一口价专区逛逛吧。</view>
</view>
<view wx:else>暂无数据</view>
</view>
</view>
</view>
<view wx:else>
<view wx:for-item="pageItem" wx:for-index="pageIndex" wx:for="{{orderList}}" wx:key="pageIndex">
<view wx:for="{{pageItem}}" wx:key="index">
<view class="bg-white" style="padding: 0rpx 32rpx" wx:if="{{pageIndex != 0 || index != 0 }}">
<wux-divider show-text="{{ false }}"></wux-divider>
</view>
<product-item item="{{item}}"></product-item>
</view>
</view>
<!--加载更多的UI-->
<view wx:if="{{form.pageNum > 1}}" style="padding:20rpx">
<wux-divider>
<view class="loadmore">
<text class="icon--refresher" wx:if="{{!finished}}"></text>
<text class="text-sm" style="margin-left:8rpx">{{finished?'到底啦~':'加载中...'}}</text>
</view>
</wux-divider>
</view>
</view>
</refresh-view>

0
submodel/pages/goods/fragment/index.wxss

133
submodel/pages/goods/goods.wxs

@ -0,0 +1,133 @@
function isEmpty(val) {
return typeof val === 'undefined' || val === '' || val === null
}
function orderStatus(status) {
if (status == 2) {
return '待确认'
} else if (status == 3 || status == 30) {
return '待审核'
} else if (status == 23 || status == 31) {
return '待审核'
} else if (status == 4) {
return '已完成'
} else if (status == 5) {
return '已取消'
} else if (status == 6) {
return '不通过'
}
return ''
}
function numberFormat(value, fix) {
if (value) {
return value.toFixed(fix)
}
return ''
}
function orderOperated(status) {
return status in [2, 3, 4]
}
function settleOrder(orderInfo, type) {
if (type == 1) {
if (parseFloat(orderInfo.settleWeight) > 0) {
return numberFormat(orderInfo.settleWeight, 3)
}
if (parseFloat(orderInfo.allSettleWeight) > 0) {
return numberFormat(orderInfo.allSettleWeight, 3)
}
} else if (type == 2) {
if (parseFloat(orderInfo.settlePrice) > 0) {
return numberFormat(orderInfo.settlePrice, 2)
}
if (!isEmpty(orderInfo.allTotalPrice) && parseFloat(orderInfo.allTotalPrice) > 0) {
return numberFormat(orderInfo.allTotalPrice, 2)
}
}
return ''
}
function formatePrice(price) {
return Number(parseFloat(price) / 100).toFixed(2)
}
function formateWeight(weight, kg) {
if (weight || weight == 0) {
if (kg) {
return (parseFloat(weight)).toFixed(1)
} else {
return (parseFloat(weight) / 1000).toFixed(3)
}
}
return ''
}
function formateAmount(price) {
return Number(parseFloat(price)).toFixed(2)
}
function formateDate(datetime) {
if (isEmpty(datetime)) {
return ''
}
var date = getDate(datetime.trim())
var today = getDate()
var dayCode = 24 * 60 * 60 * 1000
var week = ''
if (date.getTime() === today.getTime()) {
week = '(今天)'
} else if (date.getTime() === today.getTime() + dayCode) {
week = '(明天)'
} else if (date.getTime() === today.getTime() - dayCode) {
week = '(昨天)'
} else if (date.getTime() === today.getTime() + dayCode * 2) {
week = '(后天)'
} else {
week = ['(周日)', '(周一)', '(周二)', '(周三)', '(周四)', '(周五)', '(周六)'][date.getDay()]
}
if (isEmpty(week)) {
week = ''
}
return datetime + week
}
function formateText(text, length) {
if (!text) {
return ''
}
if (text.length <= length) {
return text
}
return text.substring(0, length) + '...'
}
function isVideoUrl(url) {
if (url && url.indexOf('.mp4') >= 0) {
return true
}
return false
}
function minNumber(order, num) {
if (order && parseInt(order.minBuyNum) > 0) {
return Number(order.minBuyNum)
}
return num
}
module.exports = {
orderStatus: orderStatus,
numberFormat: numberFormat,
orderOperated: orderOperated,
settleOrder: settleOrder,
formatePrice: formatePrice,
formateWeight: formateWeight,
formateDate: formateDate,
formateText: formateText,
isVideoUrl: isVideoUrl,
minNumber: minNumber,
formateAmount: formateAmount
}

238
submodel/pages/goods/index/index.js

@ -0,0 +1,238 @@
import { paperCategoryList, getGoodProductList, statusProductInfo, deleteProduct } from "../../../../api/ztb"
const util = require('../../../../utils/util')
const event = require('../../../../utils/event')
const app = getApp()
const statusList = [1, 2]
Page({
/**
* 页面的初始数据
*/
data: {
height: app.globalData.fragmentHeight,
kg: app.globalData.kg,
loading: true,
requesting: false,
finished: false,
tabList: ['一口价商品', '特价商品'],
tabIndex: 0,
tabScroll: false,
cateList: [],
cateScroll: false,
tabiList: [],
pageIndex: 0,
top: 0,
orderList: [],
form: {
firstCategoryId: '',
bidType: 1,
pageNum: 1,
pageSize:15
}
},
/**
* 生命周期函数--监听页面加载
*/
onLoad: function (options) {
this.setData({
height: app.globalData.fragmentHeight - 180,
kg: app.globalData.kg,
CustomBar: app.globalData.CustomBar
})
event.on('EventMessage', this, this.onEvent)
this.wuxDialog = this.wuxDialog || this.selectComponent('#wux-dialog')
this.fetchCateList()
this.fetchGoodsList()
},
onEvent: function (message) {
console.log('goods>>index>>onEvent', message)
if (message.what == 102) {
this.onRefreshList()
}
},
onRefreshList: function () {
if (this.data.requesting) {
return
}
this.setData({
orderList: [],
['form.firstCategoryId']: this.data.form.firstCategoryId,
['form.bidType']: this.data.form.bidType,
['form.pageNum']: 1,
loading: true,
finished: false
})
this.fetchGoodsList()
},
fetchCateList: function(){
paperCategoryList({ type: 1 }).then(result => {
//成功回调
var tabList = ['全部']
var size = 0
for (let index = 0; index < result.data.length; index++) {
tabList.push(result.data[index].name)
size += result.data[index].name.length
}
this.data.cateList = result.data
this.setData({ tabiList: tabList, cateScroll: size > 14 })
})
},
onCategoryChange: function ({detail}) {
if(this.data.pageIndex == Number(detail.index)){
return
}
this.data.pageIndex = Number(detail.index)
if(this.data.pageIndex == 0){
this.data.form.firstCategoryId = ''
} else {
this.data.form.firstCategoryId = this.data.cateList[this.data.pageIndex - 1].id
}
this.onRefreshList()
},
fetchGoodsList: function () {
if (this.data.requesting || this.data.finished) {
return
}
if (this.data.loading) {
this.data.requesting = true
} else {
this.setData({ requesting: true })
}
getGoodProductList(this.data.form).then(result => {
if (result.data.records.length) {
var respList = result.data.records
let nowList = `orderList[${this.data.orderList.length}]`
var num = this.data.form.pageNum
var finished = this.data.form.pageNum >= result.data.pages
if(this.data.form.pageNum == 1){
this.setData({
[nowList]: respList,
total: result.data.total,
['form.pageNum']: (num + 1),
top: 0,
finished,
requesting: false,
loading: false
})
} else {
this.setData({
[nowList]: respList,
total: result.data.total,
['form.pageNum']: (num + 1),
finished,
requesting: false,
loading: false
})
}
} else {
this.setData({
finished: true,
requesting: false,
loading: false
})
}
}).catch(err => {
//异常回调
this.setData({
requesting: false,
loading: false
})
util.showToast(err)
})
},
lookItem: function (e) {
var item = this.data.orderList[e.currentTarget.dataset.page][e.currentTarget.dataset.index]
// wx.navigateTo({
// url: '/pages/goods/detail/index?id=' + item.id
// })
},
editItem: function (e) {
var item = this.data.orderList[e.currentTarget.dataset.page][e.currentTarget.dataset.index]
wx.navigateTo({ url: '/pages/goods/create/index?id=' + item.id })
},
shelvesItem: function (e) {
var page = e.currentTarget.dataset.page
var index = e.currentTarget.dataset.index
var item = this.data.orderList[page][index]
var that = this
if(item.status == 1){
this.wuxDialog.open({
resetOnClose: true,
title: '温馨提示',
content: '确定下架该商品?',
buttons: [{
text: '取消'
}, {
text: '确定',
type: 'primary',
onTap(e) {
that.statusItem(item, page, index, 2)
}
}]
})
} else {
that.statusItem(item, page, index, 1)
}
},
statusItem: function(item, page, index, status){
wx.showLoading({ title: '处理中', mask: true })
statusProductInfo({productId: item.id, status}).then(result => {
this.setData({ ['orderList[' + page + '][' + index + '].status']: status })
wx.hideLoading()
if(status == 2){
util.showToast('商品下架成功!')
} else {
util.showToast('商品上架成功!')
}
}).catch(err => {
//异常回调
wx.hideLoading()
util.showToast(err)
})
},
removeItem: function (e) {
var item = this.data.orderList[e.currentTarget.dataset.page][e.currentTarget.dataset.index]
var that = this
this.wuxDialog.open({
resetOnClose: true,
title: '温馨提示',
content: '确定删除该商品?',
buttons: [{
text: '取消'
}, {
text: '确定',
type: 'primary',
onTap(e) {
that.deleteItem(item)
}
}]
})
},
deleteItem: function(item){
wx.showLoading({ title: '处理中', mask: true })
deleteProduct({productId: item.id}).then(result => {
wx.hideLoading()
this.onRefreshList()
util.showToast('商品删除成功!')
}).catch(err => {
//异常回调
wx.hideLoading()
util.showToast(err)
})
},
onTabChange: function ({detail}) {
if (this.data.tabIndex == detail.index) {
return
}
this.data.tabIndex = detail.index
this.data.form.bidType = statusList[this.data.tabIndex]
this.data.form.firstCategoryId = ''
this.setData({ pageIndex: 0, ['form.bidType']: statusList[this.data.tabIndex] })
this.onRefreshList()
},
onUnload: function(){
event.remove('EventMessage', this)
}
})

10
submodel/pages/goods/index/index.json

@ -0,0 +1,10 @@
{
"usingComponents": {
"refresh-view": "/components/refresher/index",
"wux-tabi": "/components/tabi/index",
"wux-image": "/components/image/index",
"wux-divider": "/components/divider/index",
"wux-dialog": "/components/dialog/index",
"wux-button": "/components/button/index"
}
}

69
submodel/pages/goods/index/index.wxml

@ -0,0 +1,69 @@
<!--pages/goods/index/index.wxml-->
<wxs module="formate" src="../../../../pages/formate.wxs"></wxs>
<cu-custom bgColor="bg-white" isBack="{{true}}">
<view slot="content">商品管理</view>
</cu-custom>
<view class="nav bg-white fixed" style="top:{{CustomBar}}px;">
<wux-tabi tab-data="{{tabList}}" tab-index="{{tabIndex}}" bind:change="onTabChange"></wux-tabi>
<wux-divider show-text="{{ false }}"></wux-divider>
<wux-tabi scroll="{{cateScroll}}" tab-data="{{tabiList}}" tab-index="{{pageIndex}}" bind:change="onCategoryChange"></wux-tabi>
</view>
<view style="height:180rpx;width:100%"></view>
<refresh-view bind:refresh="onRefreshList" height="{{height}}" triggered="{{requesting}}" scrollTop="{{top}}" bind:scrolltolower="fetchGoodsList">
<view wx:if="{{!orderList.length}}">
<view class="list-empty" style="height:{{height}}rpx">
<view class="load-spinner text-gray" style="margin-bottom:24px" wx:if="{{loading}}" />
<image class="img-empty" src="/assets/image/list_empty.png" wx:else></image>
<view class="text-empty">{{loading? '正在加载' : '暂无数据'}}</view>
</view>
</view>
<view wx:else>
<view wx:for-item="pageItem" wx:for-index="pageIndex" wx:for="{{orderList}}" wx:key="pageIndex">
<view wx:for="{{pageItem}}" wx:key="index">
<wux-divider show-text="{{ false }}" wx:if="{{pageIndex != 0 || index != 0 }}"></wux-divider>
<view class="flex item-content" data-page="{{pageIndex}}" data-index="{{index}}" bindtap="lookItem">
<wux-image width="{{100}}" height="{{100}}" shape="rounded" lazyLoad="true" src="{{item.coverImgUrl}}" mode="aspectFill">
<image class="image-load" slot="loading" src="/assets/image/def_image.png"></image>
</wux-image>
<view style="flex:1;padding-left:20rpx;padding-top:8rpx;height:100px">
<view class="flex flex-justify" style="height:20px;">
<view class="page-name">
<text>{{item.secondCategoryName}}</text>
<text style="font-size:22rpx;margin-left:4rpx">{{item.locProvinceName + item.locCityName}}</text>
</view>
<view class="page-num">库存:{{formate.formateWeight(item.stock, kg)}}</view>
</view>
<view style="height:50px">
<view class="page-outline">{{item.description || ''}}</view>
</view>
<view class="flex flex-justify">
<view class="page-price" wx:if="{{formate.formatePrice(item.unitPrice, kg) !=''}}">¥{{formate.formatePrice(item.unitPrice, kg)}}</view>
<view class="page-price" wx:if="{{formate.formatePrice(item.unitPrice, kg) ==''}}">价格面议</view>
<view class="flex">
<wux-button outline size="tag" data-page="{{pageIndex}}" data-index="{{index}}" bind:click="editItem" wx:if="{{item.bidType == 1 && item.status == 2}}">编辑</wux-button>
<wux-button outline style="margin-left:9px" size="tag" data-page="{{pageIndex}}" data-index="{{index}}" wx:if="{{item.bidType == 1}}" bind:click="shelvesItem">{{item.status == 2 ? '上架': '下架'}}</wux-button>
<wux-button outline style="margin-left:9px" size="tag" data-page="{{pageIndex}}" data-index="{{index}}" wx:if="{{item.bidType == 2 && item.status == 1}}" bind:click="shelvesItem">下架</wux-button>
<wux-button outline style="margin-left:9px" size="tag" data-page="{{pageIndex}}" data-index="{{index}}" wx:if="{{item.bidType == 2 && item.status == 2}}" bind:click="editItem">重新发布</wux-button>
<wux-button outline style="margin-left:9px" size="tag" data-page="{{pageIndex}}" data-index="{{index}}" bind:click="removeItem" wx:if="{{item.status == 2}}">删除</wux-button>
</view>
</view>
</view>
</view>
</view>
</view>
<!--加载更多的UI-->
<view wx:if="{{form.pageNum>1}}" style="padding:20rpx">
<wux-divider>
<view class="loadmore">
<text class="icon--refresher" wx:if="{{!finished}}"></text>
<text class="text-sm" style="margin-left:8rpx">{{finished?'到底啦~':'加载中...'}}</text>
</view>
</wux-divider>
</view>
</view>
</refresh-view>
<wux-dialog id="wux-dialog" />

51
submodel/pages/goods/index/index.wxss

@ -0,0 +1,51 @@
.item-content {
height: 120px;
background: rgba(255, 255, 255, 1);
padding:20rpx
}
.page-name {
font-size: 32rpx;
font-family: PingFang-SC-Medium, PingFang-SC;
font-weight: 500;
color: rgba(51, 51, 51, 1);
line-height: 22px;
}
.page-num {
font-size: 24rpx;
font-family: PingFang-SC-Regular, PingFang-SC;
font-weight: 400;
color: rgba(153, 153, 153, 1);
}
.page-outline {
margin-top: 8rpx;
font-size: 28rpx;
font-family: PingFang-SC-Regular, PingFang-SC;
font-weight: 400;
color: rgba(51, 51, 51, 1);
display: -webkit-box;
overflow: hidden;
text-overflow: ellipsis;
word-wrap: break-word;
white-space: normal !important;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
}
.page-price {
line-height: 30rpx;
font-size: 32rpx;
font-family: DINAlternate-Bold, DINAlternate;
font-weight: bold;
color: rgba(255, 66, 43, 1);
}
.image-load {
width: 100px;
height: 100px;
display: flex;
align-items: center;
justify-content: center;
}

26
submodel/pages/goods/product-item/index.js

@ -0,0 +1,26 @@
const app = getApp()
Component({
options: {
addGlobalClass: true,
multipleSlots: true
},
properties: {
item: { type: Object, value: null }
},
data: {
kg: app.globalData.kg
},
lifetimes: {
// 生命周期函数,可以为函数,或一个在methods段中定义的方法名
attached: function () {
this.setData({ kg: app.globalData.kg })
}
},
methods: {
lookItem: function (e) {
wx.navigateTo({ url: '/pages/mall/detail/index?id=' + this.data.item.id })
}
}
})

6
submodel/pages/goods/product-item/index.json

@ -0,0 +1,6 @@
{
"component": true,
"usingComponents": {
"wux-image": "/components/image/index"
}
}

27
submodel/pages/goods/product-item/index.wxml

@ -0,0 +1,27 @@
<wxs module="formate" src="../../../../pages/formate.wxs"></wxs>
<view class="flex item-content" bindtap="lookItem">
<wux-image width="{{100}}" height="{{100}}" lazyLoad="true" src="{{item.coverImgUrl}}" mode="aspectFill">
<image class="image-load" slot="loading" src="/assets/image/def_image.png"></image>
</wux-image>
<view style="flex:1;padding-left:24rpx;height:100px">
<view class="flex" style="height:20px;align-items: center">
<image style="width:40px;height:20px;margin-right:12rpx" src="/assets/image/ico_tag{{item.bidType == 2 ? '2' : '1'}}.png"></image>
<view class="page-name">{{item.firstCategoryName || item.secondCategoryName}}</view>
</view>
<view class="flex page-num" style="margin-top:8rpx;justify-content: space-between">
<view class="text-cut" style="font-size:24rpx;max-width: 240rpx">{{item.locProvinceName + item.locCityName}}
</view>
<view style="font-size:24rpx;margin-left:24rpx" wx:if="{{item.stock}}">库存:{{formate.formateWeight(item.stock, kg)}}</view>
</view>
<view class="flex flex-center" style="margin-top:16rpx;justify-content: flex-start">
<text class="text-xs text-gray" wx:if="{{item.bidType == 2}}">起拍单价</text>
<text class="page-price" wx:if="{{formate.formatePrice(item.unitPrice, kg)!=''}}">¥{{formate.formatePrice(item.unitPrice, kg)}}</text>
<view class="text-df" style="color: rgba(255, 66, 43, 1);margin-left:8rpx" wx:if="{{formate.formatePrice(item.unitPrice, kg)!=''}}">{{ kg? '元/KG' : '元/吨' }}
</view>
<text class="page-price" wx:if="{{formate.formatePrice(item.unitPrice, kg)==''}}">价格面议</text>
</view>
<view style="height:32px">
<view class="page-outline">{{item.description || ''}}</view>
</view>
</view>
</view>

49
submodel/pages/goods/product-item/index.wxss

@ -0,0 +1,49 @@
.item-content {
background: rgba(255, 255, 255, 1);
padding:32rpx
}
.page-name {
font-size: 36rpx;
font-weight: bold;
color: rgba(51, 51, 51, 1);
line-height: 20px;
}
.page-num {
font-size: 24rpx;
font-family: PingFang-SC-Regular, PingFang-SC;
font-weight: 400;
color: #040404;
}
.page-outline {
margin-top: 8rpx;
font-size: 24rpx;
font-family: PingFang-SC-Regular, PingFang-SC;
font-weight: 400;
color: #999999;
display: -webkit-box;
overflow: hidden;
text-overflow: ellipsis;
word-wrap: break-word;
white-space: normal !important;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
}
.page-price {
line-height: 30rpx;
font-size: 34rpx;
font-family: DINAlternate-Bold, DINAlternate;
font-weight: bold;
color: rgba(255, 66, 43, 1);
}
.image-load {
width: 100px;
height: 100px;
display: flex;
align-items: center;
justify-content: center;
}

66
submodel/pages/paper/index/index.js

@ -0,0 +1,66 @@
// submodel/pages/paper/index/index.js
Page({
/**
* 页面的初始数据
*/
data: {
},
/**
* 生命周期函数--监听页面加载
*/
onLoad: function (options) {
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady: function () {
},
/**
* 生命周期函数--监听页面显示
*/
onShow: function () {
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide: function () {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload: function () {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh: function () {
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom: function () {
},
/**
* 用户点击右上角分享
*/
onShareAppMessage: function () {
}
})

3
submodel/pages/paper/index/index.json

@ -0,0 +1,3 @@
{
"usingComponents": {}
}

2
submodel/pages/paper/index/index.wxml

@ -0,0 +1,2 @@
<!--submodel/pages/paper/index/index.wxml-->
<text>submodel/pages/paper/index/index.wxml</text>

1
submodel/pages/paper/index/index.wxss

@ -0,0 +1 @@
/* submodel/pages/paper/index/index.wxss */
Loading…
Cancel
Save