tianyi 3 days ago
parent
commit
b78da7c562
  1. 4
      pages/Orderstatistics/index.vue
  2. 0
      pages/detailmap/index.vue
  3. 158
      pages/index/index.vue
  4. 27
      pages/login/login.vue
  5. 319
      pages/myCenter/setPrint.vue
  6. 881
      pages/shop/addGoods.vue
  7. 381
      pages/shop/addType.vue
  8. 333
      pages/shop/dataStatistics.vue
  9. 570
      pages/shop/goodsList.vue
  10. 271
      pages/shop/orderDetail.vue
  11. 189
      pages/shop/shopBill.vue
  12. 434
      pages/shop/shopEvaluate.vue
  13. 330
      pages/shop/shopOrderList.vue
  14. 154
      pages/shop/shopSettlementDetail.vue

4
pages/Orderstatistics/index.vue

@ -283,9 +283,7 @@
})
},
gotomapdetail(item) {
// uni.navigateTo({
// url: '../detailmap/index?oid=' + item.id,
// });
this.$refs.detailPopup.open()
},
getlist() {

0
pages/detailmap/index.nvue → pages/detailmap/index.vue

158
pages/index/index.vue

@ -14,8 +14,9 @@
<img :src="shop.shopIcon" alt="" />
</view>
<view class="title2">
<view class="title22">
<view class="title22" @tap="checkArea">
{{shop.shopName}}
<uni-icons type="right"></uni-icons>
</view>
<view class="title33" @tap="updateStatus">
{{businessStatus == '1'?'暂停营业':'正常营业'}}
@ -29,7 +30,7 @@
</view>
<view class="order2">
<view class="order22">
<view class="order33" @tap="goDetail('db',3)">
<view class="order33" @tap="changeIndex(1)">
<view class="order44">
0
</view>
@ -37,7 +38,7 @@
待接单
</view>
</view>
<view class="order33" @tap="goDetail('db',4)">
<view class="order33" @tap="changeIndex(1)">
<view class="order44">
0
</view>
@ -45,7 +46,7 @@
待取货
</view>
</view>
<view class="order33" @tap="goDetail('db',5)">
<view class="order33" @tap="changeIndex(1)">
<view class="order44">
0
</view>
@ -55,7 +56,7 @@
</view>
</view>
<view class="order22">
<view class="order33" @tap="goDetail('db',2)">
<view class="order33" @tap="changeIndex(1)">
<view class="order44">
0
</view>
@ -63,7 +64,7 @@
待消费
</view>
</view>
<view class="order33" @tap="goDetail('db',7)">
<view class="order33" @tap="changeIndex(1)">
<view class="order44">
0
</view>
@ -71,7 +72,7 @@
待退款
</view>
</view>
<view class="order33" @tap="goDetail('db',11)">
<view class="order33" @tap="changeIndex(1)">
<view class="order44">
0
</view>
@ -140,7 +141,7 @@
店铺管理
</view>
</view>
<view class="menu22" @tap="goDetail('dd')">
<view class="menu22" @tap="changeIndex(1)">
<view class="menu33">
<image src="../../static/image/dingdan/dd2.png" alt="" />
</view>
@ -172,6 +173,14 @@
扫码核销
</view>
</view>
<view class="menu22" @tap="goDetail('dy')">
<view class="menu33" style="width: 100%;height: 56rpx;">
<image src="../../static/image/dingdan/dd1.png" alt="" />
</view>
<view class="menu44">
打印设置
</view>
</view>
</view>
</view>
</view>
@ -182,6 +191,17 @@
<my-center ref="myCenter"></my-center>
</view>
</view>
<!-- 弹出区域选择 -->
<uni-popup ref="areaPopup" background-color="#fff">
<view class="popup-area-content">
<view class="popup-area-title">
<text>请选择所属区域</text>
</view>
<view class="popup-area-container" v-for="(item,index) in areaList" :key="index" @tap="onClickArea(item)">
<text style="display: inline-block">{{item.shop.shopName}}</text>
</view>
</view>
</uni-popup>
<tab-bar :width="width" @tab-index="changeIndex" :currentIndex="currentIndex"></tab-bar>
</view>
</template>
@ -196,7 +216,9 @@
width: 0,
currentIndex: 0,
businessStatus:1,
shop:{}
shop:{},
areaList:[],
shopList: [],
}
},
components: {
@ -205,18 +227,58 @@
myCenter
},
onShow() {
let that = this
uni.getSystemInfo({
success: function(info) {
that.width = info.screenWidth * 2;
}
});
this.getBusinessStatus()
this.indexInit()
},
onLoad() {
},
methods: {
indexInit(){
let that = this
uni.getSystemInfo({
success: function(info) {
that.width = info.screenWidth * 2;
}
});
this.getBusinessStatus()
if(!uni.getStorageSync('area')){
this.checkArea()
}
},
//
onActionItemClick(item) {
if(this.type == 'wuliu'){
this.current = item.id
this.name = item.companyName
}else{
this.current = item.shop.id
this.name = item.shopName
this.shopOwnerPhone = item.shopOwnerPhone
}
if (!this.shopName) return this.tui.toast('请输入新店铺名称', 2000)
this.tui.request("/app/shop/modifyShopNameById", "put", {
id: this.shopId,
shopName: this.shopName
}, false, true).then((res) => {
if (res.code === 200) {
this.getList()
this.onPopupClose()
} else {
this.tui.toast(res.message)
}
})
},
checkArea(){
this.NB.sendRequest("/auth/getShopByUser", {}, false, 'post', 'application/x-www-form-urlencoded').then((res) => {
if (res.code == 200) {
this.areaList = res.result
this.$refs.areaPopup.open()
} else {
this.tui.toast(res.message)
}
})
},
//
getBusinessStatus(){
this.NB.sendRequest("/app/shoptakeaway/getByShopId", {
@ -232,6 +294,25 @@
uni.hideLoading()
}).catch((res) => {})
},
onClickArea(item){
uni.setStorageSync('area',JSON.stringify(item))
// this.searchForm.regionId = item.id
// this.getDelivery();
// this.getShopArea();
// let that = this
// that.tui.request("/worker/admin/add", "POST", {userId:uni.getStorageSync('id'),isChangeArea:0,region:item.id}, false, true).then((res) => {
// if (res.code == 200) {
// if(res.result != null){
// uni.setStorageSync('worker',res.result)
// }
// } else {
// that.tui.toast(res.message)
// return
// }
// uni.hideLoading()
// }).catch((res) => {})
this.$refs.areaPopup.close()
},
//
updateStatus(){
let that = this;
@ -261,33 +342,36 @@
let url = ''
switch (type) {
case 'tj':
url = '/package1/myCenter/dataStatistics'
url = '/pages/shop/dataStatistics'
break;
case 'db':
url = '/package2/shop/shopOrderList?index=' + index
url = '/pages/shop/shopOrderList?index=' + index
break;
case 'sp':
url = '/package1/myCenter/goodsList'
url = '/pages/shop/goodsList'
break;
case 'dp':
url = ''
break;
case 'dd':
url = '/package2/shop/shopOrderList'
url = '/pages/shop/shopOrderList'
break;
case 'zd':
url = '/package2/shop/shopBill'
url = '/pages/shop/shopBill'
break;
case 'pj':
let item = {
shopScore:uni.getStorageSync('shopScore'),
id:uni.getStorageSync('id')
}
url = '/package1/group/shopEvaluate?item=' + JSON.stringify(item)
url = '/pages/shop/shopEvaluate'
break;
case 'hx':
this.scanCodeAdd()
break;
case 'dy':
url = '/pages/myCenter/setPrint'
break;
default:
}
uni.navigateTo({
@ -346,6 +430,9 @@
this.lastIndex = this.currentIndex
this.currentIndex = index
switch (index) {
case 0:
this.indexInit()
break;
case 1:
that.$refs.deLivery.init()
break;
@ -474,4 +561,31 @@
height: 40rpx;
line-height: 40rpx;
}
.popup-area-content {
align-items: center;
justify-content: center;
padding: 30rpx;
width: 500rpx;
height: auto;
background-color: #fff;
}
.popup-area-title {
font-size: 36rpx;
font-weight: bold;
text-align: center;
position: relative;
}
.popup-area-container {
margin-top: 20rpx;
height: 100rpx;
border-radius: 20rpx;
background: #088FEB;
line-height: 100rpx;
text-align: center;
border-bottom: 1px solid #eee;
border-top: 1px solid #eee;
color: #fff;
}
</style>

27
pages/login/login.vue

@ -47,7 +47,16 @@
:class="{ opatity: enabled}" @click="submit">
{{i18n.login.login}}
</button>
<uni-popup ref="popup" background-color="#fff">
<view class="popup-content">
<view class="popup-title">
<text>选择登录店铺</text>
</view>
<view class="popup-container" v-for="item in shopList" :key="item" @tap="checkShop(item)">
<text style="display: inline-block">{{item.shopName}}</text>
</view>
</view>
</uni-popup>
</view>
</template>
@ -322,6 +331,8 @@
uni.setStorageSync('shopAddress',res.result.shopAddress)
uni.setStorageSync('shopRemark',res.result.remark)
uni.setStorageSync("shopOwnerPhone", item.shopOwnerPhone)
uni.setStorageSync('schoolShop',res.result.shop)
uni.setStorageSync('area',JSON.stringify(item))
uni.setStorageSync("isShop",true)
setTimeout(() => {
uni.reLaunch({
@ -338,6 +349,11 @@
}
});
},
//
toggle(type) {
this.type = type
this.$refs.popup.open(type)
},
submit() {
if (this.enabled) {
uni.showToast({
@ -383,9 +399,14 @@
uni.setStorageSync("wayValue", this.wayValue)
uni.setStorageSync("nickname", res.result.user.nickname)
uni.setStorageSync('username',this.mobile)
uni.setStorageSync('shop',JSON.stringify(res.result.shopList[0].shop))
this.checkShop(res.result.shopList[0])
if (res.result.shopList.length > 1) {
this.shopList = res.result.shopList;
this.toggle("center");
}else{
this.checkShop(res.result.shopList[0])
}
})
}

319
pages/myCenter/setPrint.vue

@ -0,0 +1,319 @@
<template>
<view class="">
<view class="btn">
<button type="primary" :loading="isSearching" v-if="isSearching == false" @tap="startSearch(true)"
text="">搜索蓝牙设备
</button>
<button type="primary" :loading="isSearching" v-if="isSearching == true" @tap="stopSearch" text="">搜索蓝牙设备
</button>
<button type="primary" style="margin-top: 40rpx;" v-if="okAddress !=''" @tap="endSearch(true)"
text="">删除已连接蓝牙设备
</button>
<button type="primary" style="margin-top: 40rpx;font-size: 32rpx;" :loading="isPrint" v-if="okAddress"
@tap="pickUpOnce" text=''>打印测试</button>
</view>
<view class="content">
<text>新设备</text>
<view v-for="(item) in list" :data-title="item.deviceId" :data-name="item.name"
:data-advertisData="item.advertisServiceUUIDs" :key="item.deviceId"
@tap="bindViewTap(item.deviceId,true)">
<view>
<text>{{item.name}}</text>
<view v-if="linkAddress == item.deviceId" style="background-color: #4caf50;">正在匹配</view>
<view v-if="okAddress == item.deviceId">匹配成功</view>
</view>
</view>
</view>
</view>
</template>
<script>
import PrinterJobs from '@/components/print/printerjobs.js'
import printerUtil from '@/components/print/printerutil.js'
import util from '@/components/print/util.js'
import drawQrcode from '@/components/print/weapp.qrcode.esm.js'
import Bluetooth from '@/components/print/bluetooth.js'
let bluetooth = new Bluetooth();
export default {
components: {},
data() {
return {
isSearching: false,
list: [],
okAddress: '',
linkAddress: '',
data: {
"settled_name": "#0112配送",
"detail": {
"total_amount": "137.00",
"other_amount": "0.00",
"discount_amount": "0.00",
"actual_amount": "137.00",
"order_sn": "20220512165337",
"goods_count": 3,
"order_time": "2022-05-12 16:53:00",
"supplier_id": 1
},
"code": "https://www.oulaisong.com/purchase?id=8",
"list": [{
"id": 8,
"goods_name": "红烧带鱼",
"article_number": "1",
'sum_price':'16.00'
}, {
"id": 9,
"goods_name": "女童外套",
"article_number": "2",
"sum_price": "34.00"
}, {
"id": 10,
"goods_name": "25",
"article_number": "3",
"sum_price": "3.00"
}]
},
isPrint: false,
}
},
//
// onUnload() {
// uni.hideLoading()
// bluetooth.closeBLEConnection();
// bluetooth.closeBluetoothAdapter();
// },
//,,
onLoad() {
uni.getLocation({
type: 'wgs84',
success: function(res) {
console.log('当前位置的经度:' + res.longitude);
console.log('当前位置的纬度:' + res.latitude);
}
});
// this.getData()
},
onShow() {
console.log('---')
},
methods: {
endSearch(){
uni.hideLoading()
bluetooth.closeBLEConnection();
bluetooth.closeBluetoothAdapter();
this.okAddress = ''
},
getData() {
var that = this;
that.startSearch(false);
},
async bindViewTap(deviceId, state) {
var _this = this;
_this.okAddress = '';
_this.linkAddress = deviceId;
console.log(deviceId)
if (state == true) {
_this.isSearching = false
}
try {
//1.
await bluetooth.createBLEConnection(deviceId).then((res) => {
bluetooth.deviceId = deviceId;
}).catch((e) => {
throw e;
});
let server = [];
//2.
await bluetooth.getBLEDeviceServices().then((res) => {
console.log(res)
bluetooth.notifyId = '';
bluetooth.writeId = '';
bluetooth.num = 0;
bluetooth.serviceList = res
}).catch((e) => {
throw e;
});
//3.
let result3 = await bluetooth.getBLEDeviceCharacteristics().then(res => {
_this.okAddress = deviceId;
_this.linkAddress = '';
uni.setStorageSync('bluetoothDeviceId', deviceId);
}).catch((e) => {
throw e;
});
} catch (e) {
_this.okAddress = '';
_this.linkAddress = '';
//TODO handle the exception
console.log("e: " + JSON.stringify(e));
}
},
//
pickUpOnce() {
this.isPrint = true;
bluetooth.notifyBLECharacteristicValue();
let self = this;
setTimeout(() => {
self.writeBLECharacteristicValue();
}, 500);
},
//
async writeBLECharacteristicValue() {
let data = this.data;
let printerJobs = new PrinterJobs();
printerJobs.setAlign('ct').setSize(2, 2).setLineSpacing(80).print('#0112配送')
.setAlign('lt').setSize(1, 1).setLineSpacing(40).print('预计时间:2026-02-01 13:41:00')
.setAlign('lt').setSize(1, 1).setLineSpacing(40).print('七里香快餐明珠店')
.print(printerUtil.fillLine('-', 1, 50))
.setAlign('lt').setSize(2, 2).setLineSpacing(80).print('王先生')
.setAlign('lt').setSize(1, 1).setLineSpacing(40).print('联系电话: *******0775')
.setAlign('lt').setSize(2, 2).setLineSpacing(80).print('地址:黑背生东川建设集团有限公司黑恶生运河区****')
.setAlign('lt').setSize(1, 1).setLineSpacing(40).print('为保护隐私,顾客电话及地址已被隐藏,您可登录商家端或骑手端查看')
.print(printerUtil.fillLine('-', 1, 50));
for (var i = 0; i < data.list.length; i++) {
printerJobs.setAlign('lt').setSize(1, 1).setLineSpacing(40).print(data.list[i].goods_name)
let setLineSpacing = 40
printerJobs.setLineSpacing(setLineSpacing).print(printerUtil.inlineArr([{
'text': 'X' + data.list[i].article_number,
'width': 20,
}, {
'text': data.list[i].sum_price,
'width': 10,
}], 1, 50));
}
printerJobs.print(printerUtil.fillLine('-', 1, 50))
.setAlign('lt').setSize(1, 1).setLineSpacing(40).print('配送费:1圆')
.setAlign('lt').setSize(1, 1).setLineSpacing(40).print('合计金额:17圆')
.print(printerUtil.fillLine('-', 1, 50))
.setAlign('lt').setSize(1, 1).setLineSpacing(40).print('商品取到后,如有任何商品问题,请及时联系商家和平台,客服将为您服务,客服电话15533910775,谢谢您的惠顾')
.println();
let buffer = printerJobs.buffer();
this.sendPrint(buffer);
},
sendPrint(buffer) {
// 1.
// 2.20
//
let that = this
const maxChunk = 20;
const delay = 20;
that.isPrint = true;
for (let i = 0, j = 0, length = buffer.byteLength; i < length; i += maxChunk, j++) {
let subPackage = buffer.slice(i, i + maxChunk <= length ? (i + maxChunk) : length);
setTimeout(this.sendPrintData, j * delay, subPackage);
}
that.isPrint = false;
},
sendPrintData(buffer) {
bluetooth.writeBLECharacteristicValue(buffer).then(res => {});
},
startSearch(state) {
let that = this
bluetooth.openBluetoothAdapter().then(e => {
that.isSearching = true;
uni.startBluetoothDevicesDiscovery({
success: res => {
uni.onBluetoothDeviceFound(result => {
let arr = that.list;
let devices = [];
let list = result.devices;
for (let i = 0; i < list.length; ++i) {
console.log(list[i])
if (list[i].name && list[i].name != "未知设备") {
let arrNew = arr.filter((item) => {
return item.deviceId == list[i].deviceId;
});
if (arrNew.length == 0) {
devices.push(list[i]);
}
if (uni.getStorageSync('bluetoothDeviceId') == list[i]
.deviceId) {
// that.bindViewTap(list[i].deviceId, state)
}
}
}
that.list = arr.concat(devices);
});
},
fail: res => {
uni.hideLoading();
uni.showToast({
title: `搜索设备失败` + JSON.stringify(err)
})
}
})
}).catch(e => {
console.log(e)
});
},
//
stopSearch() {
this.isSearching = false;
uni.hideLoading();
bluetooth.stopBluetoothDevicesDiscovery();
},
}
}
</script>
<style>
page {
background: #F7F8FA;
}
</style>
<style scoped lang="scss">
.btn {
padding: 40rpx;
}
.content {
padding: 40rpx;
&>text {
display: block;
padding-bottom: 30rpx;
font-size: 28rpx;
color: #333
}
&>view {
background-color: #fff;
padding: 30rpx 40rpx;
margin-bottom: 24rpx;
&>view {
display: flex;
align-items: center;
justify-content: space-between;
&>text {
margin-left: 24rpx;
font-size: 32rpx;
font-weight: 500;
color: #333333;
}
&>view {
border-radius: 10rpx;
font-size: 24rpx;
color: #fff;
background-color: #3769FF;
padding: 5rpx 10rpx;
}
}
}
&>view:last-child {
margin-bottom: 0;
}
}
</style>

881
pages/shop/addGoods.vue

@ -0,0 +1,881 @@
<!-- 底部菜单--库存--新增商品 -->
<template>
<view class="page1">
<view class="title">
<view class="title-sreach">
<view class="back-btn" @tap="back">
<uni-icons type="left" size="28"></uni-icons>
</view>
<view class="title-name">
新增商品
</view>
</view>
</view>
<view class="formBox">
<uni-forms ref="form" :modelValue="formData" :rules="rules" labelWidth="170rpx">
<uni-forms-item label="商品名称" name="productName" required>
<uni-easyinput type="text" v-model="formData.productName" placeholder="请输入商品名称" trim="all" />
</uni-forms-item>
<uni-forms-item label="商品主图" name="productPicture">
<view style="display: flex;">
<view class="upload-img" @tap="pictureAdd"
style="background: #eee;text-align: center;line-height: 160rpx;">
<uni-icons type="camera" size="28" color="#777"></uni-icons>
</view>
<view style="overflow-x: scroll;display: flex;width: 350rpx;">
<view v-if="formData.productPicture !=''" style="width: 160rpx;height: 160rpx;margin-left: 20rpx;">
<img :src="formData.productPicture" alt="" class="upload-img">
</view>
</view>
</view>
</uni-forms-item>
<uni-forms-item label="排名" name="orderFiled">
<input type="digit" class="content-input" v-model="formData.orderFiled" placeholder="请输入排名">
</uni-forms-item>
<uni-forms-item label="商品分类" name="editTitle">
<view style="border: 4rpx solid #eee;display: flex;flex: 1;border-radius: 10rpx;">
<input type="text" placeholder="请选择商品分类" disabled v-model="typeItem.categoryName"
class="content-input" @tap="goGategoryLow" style="border: 0;">
<uni-icons type="right" size="16"
style="margin-left: 40rpx;line-height: 70rpx;"></uni-icons>
</view>
</uni-forms-item>
<uni-forms-item label="商品规格" name="attributeListPrice">
<view>
<view v-for="(item,index) in formData.attributeListPrice" :key="index" style="display: flex;margin-top:10rpx;">
<input class="content-input" v-model="item.specName" v-if="item.specName != ''&& formData.attributeListPrice.length != 1" style="padding-right: 20rpx;" disabled />
<input class="content-input" v-model="item.specPrice" style="padding-right: 20rpx;margin-right: 20rpx;" @click="changePrice(index)" placeholder="商品价格" />
<input class="content-input" v-model="item.specNum" style="padding-right: 20rpx;" @click="changecount(index)" placeholder="商品库存"/>
<button @click="deldantiaoguige(index)" v-if="formData.attributeListPrice.length>1" style="width: 240rpx;height: 60rpx;line-height: 60rpx;color: red;border:none;background: #fff;">删除</button>
</view>
<!-- <view @click="checkSpec('guige')" style="margin-top: 5px;width: 80px;height: 30px;text-align: center;line-height: 30px;background: rgba(0, 35, 28, 1);border-radius: 30px;color: rgba(166, 255, 234, 1);">
选择规格
</view> -->
</view>
</uni-forms-item>
<uni-forms-item label="拼团信息" name="productGroupBuyPrices">
<view>
<view v-for="(item,index) in formData.productGroupBuyPrices" :key="index" style="display: flex;margin-top:10rpx;">
<input class="content-input" v-model="item.groupCount" style="padding-right: 20rpx;margin-right: 20rpx;" placeholder="成团人数" />
<input class="content-input" v-model="item.groupPrice" style="padding-right: 20rpx;" placeholder="成团价格"/>
<button @click="delGroup(index)" v-if="formData.productGroupBuyPrices.length>1" style="width: 240rpx;height: 60rpx;line-height: 60rpx;color: red;border:none;background: #fff;">删除</button>
</view>
<view @click="addGroup()" style="margin-top: 10rpx;width: 160rpx;height: 60rpx;text-align: center;line-height: 60rpx;background: rgba(0, 35, 28, 1);border-radius: 60rpx;color: rgba(166, 255, 234, 1);">
新增拼团
</view>
</view>
</uni-forms-item>
<uni-forms-item label="商品属性" name="attributeList1">
<view style="display: flex;flex-direction: column;">
<view v-for="(value,key) in Array.from(formData.attributeList1)" :key="index" style="display: flex;">
{{value[0]}}:
<view v-for="(item,index) in value[1].title" :key="index">
{{item}}
</view>
</view>
<view @click="checkSpec('shuxing')" style="width: 160rpx;height: 60rpx;text-align: center;line-height: 60rpx;background: rgba(0, 35, 28, 1);border-radius: 60rpx;color: rgba(166, 255, 234, 1);">
选择属性
</view>
</view>
</uni-forms-item>
<uni-forms-item label="可售时间" name="sellTime">
<view style="display: flex;flex-direction: column;">
<view style="line-height: 74rpx;">
<radio :checked="formData.sellTime==0" name="sellTime" @click="checkSellTime(0)" />全时段售卖
<radio :checked="formData.sellTime==1" name="sellTime" @click="checkSellTime(1)" />自定义时段
</view>
<view style="display: flex;" v-if="formData.sellTime == 1">
<picker mode="time" v-model="formData.sellBeginTime" start="00:00" end="23:59" @change="selectDateRange($event,'start')">
<view class="uni-input">{{formData.sellBeginTime}}</view>
</picker>
<view style="width: 50rpx;height: 50rpx;line-height: 50rpx;text-align: center;">-</view>
<picker mode="time" v-model="formData.sellEndTime" start="00:00" end="23:59" @change="selectDateRange($event,'end')">
<view class="uni-input">{{formData.sellEndTime}}</view>
</picker>
</view>
</view>
</uni-forms-item>
<uni-forms-item label="设置加料" name="isMoreBuy">
<view style="line-height: 74rpx;">
<radio :checked="formData.isMoreBuy==0" name="isMoreBuy" @click="checkisMoreBuy('0')" />
<radio :checked="formData.isMoreBuy==1" name="isMoreBuy" @click="checkisMoreBuy('1')" />
</view>
</uni-forms-item>
<uni-forms-item label="餐盒费" name="lunchBox">
<input type="digit" class="content-input" v-model="formData.lunchBox" placeholder="请输入餐盒费">
</uni-forms-item>
<uni-forms-item label="起售数量" name="startPayNum">
<input type="digit" class="content-input" v-model="formData.startPayNum" placeholder="请输入起售数量">
</uni-forms-item>
<uni-forms-item label="详细图文" name="startPayNum">
<view class="xiangxi-box">
<sp-editor
@init="initEditor"
@input="inputOver"
@upinImage="upinImage"
@overMax="overMax">
</sp-editor>
</view>
</uni-forms-item>
</uni-forms>
<view>
<button @tap.stop="submit()">保存</button>
</view>
</view>
<!-- 添加分类弹出层 -->
<uni-popup ref="addTypeDialog" background-color="#fff">
<view class="add-popup-content">
<view style="height:900rpx;">
<view class="content-left" style="float: left;">
<view class="left-box" v-for="(item,index) in categoryData" :key="index"
:class="item.parentId ? 'left-box-hover':''" @tap="clickLeftBtn(index)">
<text style="width: 100%;height: 100rpx;line-height: 100rpx;display: inline-block;overflow: hidden;"
:class="item.parentId ? 'red' :''">{{item.title}}</text>
</view>
</view>
<view v-for="(item,index) in categorySonData" :key="index" @tap="checkSpecValue(index)" class="content-low" :class="item.checked?'checked':''">
{{item.title}}
</view>
</view>
<view slot="footer" style="display: flex;padding-left: 40rpx;margin-top: 20rpx;">
<button type="text" @tap="$refs.addTypeDialog.close()" style="margin-right: 20rpx;">取消</button>
<button type="text" @tap="guigeSubmit">提交</button>
</view>
</view>
</uni-popup>
</view>
</template>
<script>
export default {
data() {
return {
dataList: {},
modalType:0,
categoryData:[],
categoryIndex: 0,
modalclassType:'',
categorySonData:[],
specValueArr:[],
attrValueArr:[],
editorIns: null,
typeItem: {},
formData: {
id: '',
shopId: '',
categoryId: '', //id
categoryName: '', //
productPicture: '', //
productName: '', //
orderFiled: '', //
lunchBox: 0, //
startPayNum: '', //
attributeListPrice: [{ //
specPrice: "",
specNum: 9999
}],
shopId:'',
sellTime: 0, //
isMoreBuy: 0,
sellBeginTime: '', //---
sellEndTime: '', //---
attributeList: '',
productGroupBuyPrices: [],
attributeList1: new Map(), //
productIntro: "" //
},
rules: {
productName: {
rules: [{
required: true,
errorMessage: '请输入名称',
}]
},
categoryId: {
rules: [{
required: true,
errorMessage: '请选择商品分类',
}, ],
},
},
}
},
filters: {
},
onShow() {
// uni.authorize({
// scope: 'scope.writePhotosAlbum',
// success() {
// },
// fail() {
// this.tui.toast("")
// }
// })
this.typeItem = JSON.parse(JSON.stringify(this.typeItem)) || ''
if (this.typeItem) {
this.formData.categoryId = this.typeItem.id
}
this.formData.shopId = uni.getStorageSync('shopId')
},
onLoad(option) {
this.getGategoryList()
if (option.dataList) {
this.dataList = JSON.parse(option.dataList)
this.NB.sendRequest("/app/product/getById/"+ this.dataList.id, {}, false, 'POST', 'application/json').then((res) => {
if (res.code == 200) {
this.modalType = 1
this.formData.id = res.result.id
this.formData.shopId = res.result.shopId
this.formData.categoryName = res.result.categoryName
this.formData.orderFiled = res.result.orderFiled
this.formData.lunchBox = res.result.lunchBox
this.formData.startPayNum = res.result.startPayNum
this.formData.attributeListPrice = JSON.parse(res.result.attributeListPrice)
this.formData.shopId = res.result.shopId
this.formData.sellTime = res.result.sellBeginTime !=''?1:0
this.formData.isMoreBuy = res.result.isMoreBuy
this.formData.sellBeginTime = res.result.sellBeginTime
this.formData.sellEndTime = res.result.sellEndTime
this.formData.attributeList = res.result.attributeList
this.formData.productGroupBuyPrices = res.result.productGroupBuyPrices
this.formData.attributeList1 = new Map()
this.formData.productName = res.result.productName
this.formData.productPicture = res.result.productPicture
this.formData.productIntro = res.result.productIntro
this.formData.categoryId = res.result.categoryId
this.edit(this.formData)
} else {
this.tui.toast(res.message)
}
}).catch((res) => {})
}
},
methods: {
/**
* 获取输入内容
* @param {Object} e {html,text} 内容的html文本和text文本
*/
inputOver(e) {
//
console.log('==== inputOver :', e)
this.productIntro = e
},
/**
* 超出最大内容限制
* @param {Object} e {html,text} 内容的html文本和text文本
*/
overMax(e) {
//
console.log('==== overMax :', e)
},
/**
* 编辑器就绪
* @param {Object} editor 编辑器实例你可以自定义调用editor实例的方法
* @tutorial editor组件 https://uniapp.dcloud.net.cn/component/editor.html#editor-%E7%BB%84%E4%BB%B6
* @tutorial 相关api https://uniapp.dcloud.net.cn/api/media/editor-context.html
*/
initEditor(editor) {
this.editorIns = editor //
//
},
/**
* 直接运行示例工程插入图片无法正常显示的看这里
* 因为插件默认采用云端存储图片的方式
* 以$emit('upinImage', tempFiles, this.editorCtx)的方式回调
* @param {Object} tempFiles
* @param {Object} editorCtx
*/
upinImage(tempFiles, editorCtx) {
/**
* 本地临时插入图片预览
* 注意这里仅是示例本地图片预览因为需要将图片先上传到云端再将图片插入到编辑器中
* 正式开发时还请将此处注释并解开下面 使用 uniCloud.uploadFile 上传图片的示例方法 的注释
* @tutorial https://uniapp.dcloud.net.cn/api/media/editor-context.html#editorcontext-insertimage
*/
// #ifdef MP-WEIXIN
// tempFilePath
editorCtx.insertImage({
src: tempFiles[0].tempFilePath,
width: '80%', // 100%便
success: function() {}
})
// #endif
// #ifndef MP-WEIXIN
editorCtx.insertImage({
src: tempFiles[0].path,
width: '80%', // 100%便
success: function() {}
})
// #endif
/**
* 使用 uniCloud.uploadFile 上传图片的示例方法可适用多选上传
* 正式开发环境中请将上面 本地临时插入图片预览 注释后模仿以下写法
*/
// tempFiles.forEach(async (item) => {
// uni.showLoading({
// title: '',
// mask: true
// })
// let upfile = await uniCloud.uploadFile({
// filePath: item.path,
// // policy_does_not_allow_file_overwrite
// // cloudPath / cloudstorage
// cloudPath: `cloudstorage/${item.name}`,
// cloudPathAsRealPath: true
// })
// editorCtx.insertImage({
// src: upfile.fileID,
// width: '80%', // 100%便
// success: function () {
// uni.hideLoading()
// }
// })
// })
},
//
goGategoryLow() {
uni.navigateTo({
url: '/pages/shop/addType'
})
},
//
getGategoryList() {
this.NB.sendRequest("/app/productCategory/list", {
shopId:uni.getStorageSync('shopId')
}, false, 'get', 'application/json').then((res) => {
if (res.code == 200) {
if (res.result.length > 0) {
if(this.formData.categoryId != '' && this.formData.categoryId != undefined){
for(let i=0;i<res.result.length;i++){
if(res.result[i].id == this.formData.categoryId){
this.typeItem = res.result[i]
}
}
}else{
this.typeItem = res.result[0]
this.formData.categoryId = this.typeItem.id
}
}
} else {
this.tui.toast(res.message)
}
}).catch((res) => {})
},
//
submit() {
let that = this;
// this.$refs.form.validate((valid) => {
// if (valid) {
if (this.modalType == 0) {
// id
delete this.formData.id;
if(this.formData.isMoreBuy != 1){
this.formData.isMoreBuy = 0
}
this.formData.attributeListPrice = JSON.stringify(this.formData.attributeListPrice)
this.formData.attributeList = Object.fromEntries(this.formData.attributeList1)
this.formData.attributeList = JSON.stringify(this.formData.attributeList)
this.NB.sendRequest("/app/product/save", this.formData, false, 'post', 'application/json').then((res) => {
if(res.code == 200){
that.tui.toast("操作成功");
uni.navigateBack()
}
}).catch(() => {});
} else if (this.modalType == 1) {
//
this.formData.attributeListPrice = JSON.stringify(this.formData.attributeListPrice)
this.formData.attributeList = Object.fromEntries(this.formData.attributeList1)
this.formData.attributeList = JSON.stringify(this.formData.attributeList)
this.formData.productPictures = []
this.NB.sendRequest("/app/product/edit", this.formData, false, 'post', 'application/json').then((res) => {
if(res.code == 200){
that.tui.toast("操作成功");
uni.navigateBack()
}
}).catch(() => {});
}
// }
// });
},
back() {
uni.navigateBack()
},
checkisMoreBuy(type){
this.formData.isMoreBuy = type;
},
checkSellTime(type){
this.formData.sellTime = type;
},
selectDateRange(e,type){
if(type == 'start'){
this.formData.sellBeginTime = e.detail.value
}else{
this.formData.sellEndTime = e.detail.value
}
},
guigeSubmit(){
if(this.modalclassType == 'shuxing'){
for(let i=0;i<this.attrValueArr.length;i++){
if(this.formData.attributeList1.size == 0){
//set has get
let data = {
title:[]
}
data.title.push(this.attrValueArr[i].title)
this.formData.attributeList1.set(this.attrValueArr[i].parentName,data)
}else{
if(this.formData.attributeList1.has(this.attrValueArr[i].parentName) && this.formData.attributeList1.get(this.attrValueArr[i].parentName).title.indexOf(this.attrValueArr[i].title) == -1){
this.formData.attributeList1.get(this.attrValueArr[i].parentName).title.push(this.attrValueArr[i].title)
}else{
let data = {
title:[]
}
data.title.push(this.attrValueArr[i].title)
this.formData.attributeList1.set(this.attrValueArr[i].parentName,data)
}
}
}
}else{
//guige
let message = []
for(let i=0;i<this.specValueArr.length;i++){
for(let m=0;m<this.formData.attributeListPrice.length;m++){
if(this.specValueArr[i].id == this.formData.attributeListPrice[m].id){
this.specValueArr[i].specPrice = this.formData.attributeListPrice[m].specPrice
this.specValueArr[i].specName = this.formData.attributeListPrice[m].specName
this.specValueArr[i].specNum = this.formData.attributeListPrice[m].specNum
}
}
message.push({
id:this.specValueArr[i].id,
specName:this.specValueArr[i].specName == undefined ? this.specValueArr[i].title : this.specValueArr[i].specName,
specPrice:this.specValueArr[i].specPrice == undefined ? '' : this.specValueArr[i].specPrice,
specNum:this.specValueArr[i].specNum == undefined ? 9999 : this.specValueArr[i].specNum
})
}
this.formData.attributeListPrice = message
}
this.$forceUpdate()
this.$refs.addTypeDialog.close()
},
add() {
if (!this.selectNode.id) {
this.$Message.warning("请先选择一个分类");
return;
}
this.modalType = 0;
this.$refs.form.resetFields();
this.form.sort = this.data.length + 1;
this.formData = {
id:'',
shopId:'',
categoryId:'', //id
categoryName:'', //
productPicture:'', //
productName:'', //
lunchBox:0, //
startPayNum:'', //
orderFiled:'',//
attributeListPrice:[{ //
specPrice:"",
specNum:9999
}],
sellTime:0, //
sellBeginTime:'', //---
sellEndTime:'', //---
attributeList:'',
productGroupBuyPrices:[],
attributeList1:new Map(), //
productIntro:"" //
}
this.specValueArr = []
this.attrValueArr = []
this.formData.shopId = this.shopId
this.formData.categoryId = this.selectNode.id
this.formData.categoryName = this.selectNode.categoryName
this.modalVisible = true;
},
edit(v) {
this.modalType = 1;
// null""
for (let attr in v) {
if (v[attr] == null) {
v[attr] = "";
}
}
let str = JSON.stringify(v);
let data = JSON.parse(str);
console.log('111111',data)
this.formData = data;
this.formData.attributeList1 = JSON.parse(this.formData.attributeList)
this.formData.attributeList1 = new Map(Object.entries(this.formData.attributeList1));
this.formData.attributeListPrice = JSON.parse(this.formData.attributeListPrice)
this.formData.attributeList1.forEach((value, key) => {
for(let i = 0;i<value.title.length;i++){
this.attrValueArr.push({
parentName:key,
title:value.title[i]
})
}
});
this.specValueArr = this.formData.attributeListPrice
this.formData.sellTime = this.formData.sellBeginTime != '' ? 1 : 0
this.modalVisible = true;
},
checkSpecValue(index){
this.categorySonData[index].checked = !this.categorySonData[index].checked
if(this.modalclassType == 'shuxing'){
if(this.categorySonData[index].checked == true){
this.categorySonData[index].parentName = this.typeToAttrName
this.attrValueArr.push(this.categorySonData[index])
}else{
for(let i=0;i<this.attrValueArr.length;i++){
if(this.categorySonData[index].title == this.attrValueArr[i].title){
this.attrValueArr.splice(i,1)
}
}
}
}else{
//guige
if(this.categorySonData[index].checked == true){
this.specValueArr.push(this.categorySonData[index])
}else{
for(let i=0;i<this.specValueArr.length;i++){
if(this.categorySonData[index].id == this.specValueArr[i].id){
this.specValueArr.splice(i,1)
}
}
}
}
this.$forceUpdate()
},
//
clickLeftBtn(index) {
for (var i = 0; i < this.categoryData.length; i++) {
if (i == index) {
this.categoryData[i].parentId = true
} else {
this.categoryData[i].parentId = false
}
}
this.categoryIndex = index
this.typeToAttrName = this.categoryData[this.categoryIndex].title
this.getCateGorySon(this.categoryData[this.categoryIndex].id)
},
pictureAdd(id, huan) {
let that = this
uni.chooseMedia({
count: 9,
mediaType: ['image'],
sourceType: ['album', 'camera'],
success(res) {
uni.showLoading({
title: '加载中...',
mask: true
})
for (let i = 0; i < res.tempFiles.length; i++) {
that.upLoadFile(res.tempFiles[i].tempFilePath)
}
}
})
},
checkSpec(type){
this.$refs.addTypeDialog.open()
this.modalclassType = type
this.NB.sendRequest("/dictData/getByCondition", {
name: "",
status: "",
pageNumber: 1,
pageSize: 100000,
sort: 'sortOrder',
order: 'asc',
dictId: '2026945661353725952'
}, false, 'GET', 'application/json').then((res) => {
if(res.code == 200){
this.categoryData = res.result.content
for (var i = 0; i < this.categoryData.length; i++) {
if (i == this.categoryIndex) {
this.categoryData[i].parentId = true
} else {
this.categoryData[i].parentId = false
}
}
//parent
this.typeToAttrName = res.result.content[this.categoryIndex].title
this.getCateGorySon(res.result.content[this.categoryIndex].id)
}
}).catch(() => {});
},
getCateGorySon(id){
this.NB.sendRequest("/dictData/getByCondition", {
name: "",
status: "",
pageNumber: 1,
pageSize: 100000,
sort: 'sortOrder',
order: 'asc',
dictId: id
}, false, 'GET', 'application/json').then((res) => {
if(res.code == 200){
this.categorySonData = res.result.content
if(this.modalclassType == 'shuxing'){
for (var i = 0; i < this.categorySonData.length; i++) {
if(this.attrValueArr.length>0){
let index1 = false
for (var m = 0; m < this.attrValueArr.length; m++) {
if(this.attrValueArr[m].title == this.categorySonData[i].title){
index1 = true
this.categorySonData[i].checked = true
}
}
if(index1){
this.categorySonData[i].checked = true
}
}else{
this.categorySonData[i].checked = false
}
}
}else{
//guige
for (var i = 0; i < this.categorySonData.length; i++) {
if(this.specValueArr.length>0){
for (var m = 0; m < this.specValueArr.length; m++) {
if(this.specValueArr[m].id == this.categorySonData[i].id){
this.categorySonData[i].checked = true
}
}
}else{
this.categorySonData[i].checked = false
}
}
}
}
}).catch(() => {});
},
deldantiaoguige(index){
for (var m = 0; m < this.specValueArr.length; m++) {
if(this.specValueArr[m].id == this.formData.attributeListPrice[index].id){
this.specValueArr.splice(m,1)
this.formData.attributeListPrice.splice(index,1)
console.log("11",this.formData.attributeListPrice)
if(this.formData.attributeListPrice.length == 1){
this.formData.attributeListPrice = []
this.formData.attributeListPrice.push({
specName:"",
specPrice:'',
specNum:9999
})
this.specValueArr = []
}
this.$forceUpdate()
return
}
}
},
delGroup(index){
this.formData.productGroupBuyPrices.splice(index,1)
},
changePrice(index){
this.specValueArr[index].specPrice = this.formData.attributeListPrice[index].specPrice
},
changeCount(index){
this.specValueArr[index].specNum = this.formData.attributeListPrice[index].specNum
},
addGroup(){
let data = {
groupCount:'',
groupPrice:0
}
this.formData.productGroupBuyPrices.push(data)
},
async upLoadFile(path) {
let that = this;
let hiver_token = uni.getStorageSync("hiver_token")
await uni.uploadFile({
url: getApp().globalData.mainurl + '/upload/file',
filePath: path,
name: 'file',
header: {
"content-type": "multipart/form-data",
'accessToken': hiver_token
},
formData: {},
success: (uploadFileRes) => {
let pathData = JSON.parse(uploadFileRes.data)
that.formData.productPicture = pathData.result
that.$forceUpdate()
},
fail: (err) => {
uni.hideLoading();
uni.showToast({
title: JSON.stringify(err),
icon: 'none'
})
}
});
await setTimeout(res => {
uni.hideLoading();
}, 1000)
}
}
}
</script>
<style lang="scss">
page {
width: 100%;
height: 100%;
font-size: 24rpx;
background: #F5F8F5;
color: #00231C;
}
.page1 {
width: 100%;
height: 100%;
font-size: 24rpx;
position: relative;
}
.title {
background: url('https://jewel-shop.oss-cn-beijing.aliyuncs.com/8bc15960c2dc40268e295d6dd23aecce.png') no-repeat;
width: 100%;
height: 13%;
}
.title-sreach {
width: 100%;
display: flex;
height: 200rpx;
position: relative;
}
.back-btn {
padding-top: 110rpx;
}
.title-name {
padding-top: 110rpx;
font-size: 36rpx;
font-weight: 700;
flex: 1;
text-align: center;
}
.formBox {
padding: 10px 13px;
border-radius: 7px;
box-shadow: 0 1px 10px 2px #e2e2e2;
background-color: #fff;
overflow: scroll;
height: 85%;
}
.upload-img {
width: 160rpx;
height: 160rpx;
}
button {
height: 90rpx;
line-height: 90rpx;
font-size: 36rpx;
background: linear-gradient(90deg, rgba(227, 255, 150, 1), rgba(166, 255, 234, 1));
border-radius: 20rpx;
font-weight: 700;
flex: 1;
}
.content-input {
width: auto;
position: relative;
overflow: hidden;
flex: 1;
line-height: 1;
font-size: 28rpx;
height: 70rpx;
border: 4rpx solid #eee;
padding-left: 20rpx;
border-radius: 10rpx;
}
.add-popup-content {
align-items: center;
justify-content: center;
padding: 30rpx 30rpx 30rpx 0;
width: 600rpx;
height: 1050rpx;
background-color: #fff;
overflow: scroll;
border-radius: 20rpx;
}
.xiangxi-box{
flex: 1;
border: 1px solid #eee;
border-radius: 20rpx;
}
.left-box {
width: 100%;
height: 100rpx;
font-size: 28rpx;
text-align: center;
line-height: 100rpx;
border-bottom: 1px solid #fff;
}
.left-box-hover {
width: 100%;
height: 100rpx;
font-size: 28rpx;
text-align: center;
line-height: 50rpx;
border-bottom: 1px solid #fff;
background-color: #fff;
}
.content-left {
width: 160rpx;
background: #eee;
height: 900rpx;
overflow: scroll;
scrollbar-width: none;
}
.content-low{
height: 60rpx;
padding: 0 10rpx;
border: 1px solid #eee;
display: inline-block;
margin: 10rpx;
font-weight: bold;
line-height: 60rpx;
}
.checked{
background: #60F3FF;
color: #fff !important;
}
.uni-input{
width: 200rpx;
height: 50rpx;
line-height: 50rpx;
border-radius: 10rpx;
border: 1px solid #eee;
text-align: center;
}
</style>

381
pages/shop/addType.vue

@ -0,0 +1,381 @@
<template>
<!-- 分类管理 -->
<view class="page1">
<view class="title">
<view class="title-sreach">
<view class="back-btn" @tap="back">
<uni-icons type="left" size="28"></uni-icons>
</view>
<view class="title-name">
分类管理
</view>
</view>
</view>
<view class="card-list">
<ul>
<li @tap="clickList(item)" v-for="(item, index) in indexList" :key="index" style="height: 100rpx;line-height: 100rpx;border-bottom: 1px solid #eee;overflow: hidden;">
<view class="name">
<text>{{item.categoryName}}</text>
</view>
<button class="bj-btn" @tap.stop="inputDialogToggle('edit', item)">编辑</button>
</li>
</ul>
</view>
<view style="width: 100%;position: fixed;bottom:0;background: #fff;z-index: 99;height: 172rpx;">
<view class="add-btn" @tap="inputDialogToggle('add')">添加分类</view>
</view>
<!-- 添加分类弹出层 -->
<uni-popup ref="addTypeDialog" background-color="#fff">
<view class="add-popup-content">
<view class="add-popup-title">
<text>新增分类</text>
<uni-icons @tap='close' type="closeempty" color='red' size="16"
style="height:40rpx;line-height: 40rpx;position: absolute !important;bottom:0;right: 30rpx;"></uni-icons>
</view>
<view class="add-popup-container">
<input type="text" v-model="typeText" class="add-input" placeholder="请输入分类名称">
<input type="text" v-model="sortText" class="add-input" placeholder="可设置分类排序">
<view class="add-popup-bottom">
<view class="add-popup-btn" @tap="dialogInputConfirm">确认</view>
</view>
</view>
</view>
</uni-popup>
<!-- 编辑分类弹窗 -->
<uni-popup ref="delDialog" type="dialog">
<view class="type-popup"
style="width:100%;margin-bottom: 0;border-radius: 0;height: 650rpx;border-radius: 20rpx;">
<view style="height: 120rpx;font-size: 36rpx;font-weight: bold;line-height: 120rpx;text-align: center;">
编辑分类
</view>
<view style="height: 80rpx;font-size: 28rpx;line-height: 80rpx;text-align: center;">
请在下方输入框中输入分类名
</view>
<view style="width: 90%;margin: 40rpx auto 0;">
分类名称
<uni-easyinput type="text" v-model="inputVal" placeholder="请输入规格值" />
</view>
<view style="width: 90%;margin: 40rpx auto 0;">
排序<uni-easyinput type="text" v-model="sortTextEdit" placeholder="可设置排序" />
</view>
<view
style="width: 100%;height: 90rpx;line-height: 90rpx;text-align: center;border-radius: 0;color: #fff;display: flex;position: absolute;bottom: 0;">
<view style="flex: 1;background: linear-gradient(90deg, #60F3FF, #088FEB);" @tap="delItem">删除
</view>
<view style="flex: 1;background: linear-gradient(90deg, #FF9797, #FFC1E0);"
@tap="dialogInputConfirm">确认</view>
</view>
</view>
</uni-popup>
</view>
</template>
<script>
export default {
data() {
return {
show: false,
indexList: [],
inputVal: '',
multipleList:[],
sortText:'',
sortTextEdit:'',
typeText:'',
editItem: {},
delItems: {},
}
},
filters: {
},
onShow() {
},
onLoad(option) {
this.getGategoryList()
},
methods: {
close(){
this.$refs.addTypeDialog.close()
},
//
getGategoryList() {
this.NB.sendRequest("/app/productCategory/list", {
shopId:uni.getStorageSync('shopId')
}, false, 'get', 'application/json').then((res) => {
if (res.code == 200) {
this.indexList = res.result;
} else {
this.tui.toast(res.message)
}
}).catch(() => {});
},
delItem(item, type) {
uni.showModal({
title: '提示',
content: '确定删除该分类吗?',
success: function (res) {
if (res.confirm) {
this.delItemModal()
}
}
});
},
delItemModal() {
this.NB.sendRequest("/app/productCategory/delById", {
id: this.editItem.id,
}, false, 'POST', 'application/x-www-form-urlencoded').then((res) => {
if (res.code == 200) {
this.getGategoryList()
uni.showToast({
title: "删除成功",
icon: 'none'
})
this.$refs.carPopup.close()
this.$refs.delDialog.close()
} else {
uni.showToast({
title: "删除失败",
icon: 'none'
})
}
}).catch(() => {});
},
//
dialogInputConfirm() {
let that = this;
switch (that.typeModel) {
case 'add':
for (let i = 0; i < that.indexList.length; i++) {
if (that.indexList[i].categoryName == that.typeText) {
uni.showToast({
title: "请勿重复添加!",
icon: 'error'
})
return
}
}
if(that.typeText == ''){
that.tui.toast("请输入分类名")
return
}
this.NB.sendRequest("/app/productCategory/save", {
categoryName: that.typeText,
sort: that.sortText,
productAttributeOfAddVos:that.multipleList,
shopId:uni.getStorageSync('shopId')
}, false, 'POST', 'application/x-www-form-urlencoded').then((res) => {
if (res.code == 200) {
that.tui.toast("添加成功")
that.$refs.addTypeDialog.close()
that.sortText = ''
that.getGategoryList()
} else {
that.tui.toast("添加失败")
}
}).catch(() => {});
that.typeText = ''
that.inputVal = ''
that.multipleList = []
break;
case 'edit':
this.NB.sendRequest("/app/productCategory/edit", {
categoryName: this.inputVal,
sort: that.sortTextEdit,
id: that.editItem.id,
shopId:uni.getStorageSync('shopId')
}, false, 'POST', 'application/x-www-form-urlencoded').then((res) => {
if (res.code == 200) {
that.getGategoryList()
that.sortText = ''
uni.showToast({
title: "修改成功",
icon: 'none'
})
} else {
uni.showToast({
title: "修改失败",
icon: 'none'
})
}
}).catch(() => {});
break;
default:
}
that.$refs.delDialog.close()
this.inputVal = ""
this.$forceUpdate()
},
//
inputDialogToggle(type, item, parent) {
this.typeModel = type;
if (type == 'edit') {
this.inputVal = item.categoryName;
this.editItem = item;
this.sortTextEdit = (this.editItem.sort == null || this.editItem.sort == 'null') ? '' : this.editItem
.sort
this.$refs.delDialog.open('bottom')
} else if (type == 'add') {
this.inputVal = '';
this.isOpenId = item;
this.dialogTit = '输入分类名'
this.$refs.addTypeDialog.open('bottom')
}
},
//
clickList(item) {
let pages = getCurrentPages();
let prevPage = pages[pages.length - 2];
prevPage.$vm.typeItem = item
uni.navigateBack({
delta: 1
})
},
back() {
uni.navigateBack()
},
}
}
</script>
<style lang="scss">
page {
width: 100%;
height: 100%;
font-size: 24rpx;
background: #F5F8F5;
color: #00231C;
}
.page1 {
width: 100%;
height: 100%;
font-size: 24rpx;
position: relative;
}
.title {
background: url('https://jewel-shop.oss-cn-beijing.aliyuncs.com/8bc15960c2dc40268e295d6dd23aecce.png') no-repeat;
width: 100%;
height: 20%;
}
.title-sreach {
width: 100%;
display: flex;
height: 200rpx;
position: relative;
}
.back-btn {
padding-top: 110rpx;
}
.title-name {
padding-top: 110rpx;
font-size: 36rpx;
font-weight: 700;
flex: 1;
text-align: center;
}
.card-list {
width: 95%;
border-radius: 10upx;
background: #fff;
height: auto;
margin: -120rpx auto;
}
.name {
width: 75%;
float: left;
display: flex;
}
.bj-btn {
width: 88rpx;
height: 50rpx;
font-size: 24rpx;
padding: 0;
line-height: 50rpx;
border-radius: 50rpx;
border: none;
}
.type-popup {
width: 500rpx;
height: auto;
background: #fff;
border-radius: 20rpx;
position: relative;
margin-bottom: 40rpx;
}
.add-btn {
width: 95%;
height: 100rpx;
margin: 20rpx auto 0;
background: linear-gradient(90deg, rgba(227, 255, 150, 1), rgba(166, 255, 234, 1));
font-size: 32rpx;
font-weight: 700;
text-align: center;
line-height: 100rpx;
border-radius: 100rpx;
}
.add-popup-content {
align-items: center;
justify-content: center;
// padding: 30rpx;
width: 100%;
height: 400rpx;
background-color: #fff;
}
.add-popup-title {
font-size: 36rpx;
font-weight: bold;
text-align: center;
position: relative;
width: 95%;
margin: 20rpx auto 0;
}
.add-popup-container {
width: 95%;
margin: 20rpx auto 0;
}
.add-popup-bottom {
display: flex;
height: 80rpx;
color: #fff;
line-height: 80rpx;
margin-top: 50rpx;
}
.add-popup-btn {
flex: 1;
text-align: center;
background: rgba(0, 35, 28, 1);
border-radius: 80rpx;
color: rgba(166, 255, 234, 1);
}
.add-input{
width: 95%;
border: 1px solid #eee;
height: 80rpx;
padding-left: 20rpx;
margin:20rpx auto 0;
font-size: 25rpx;
line-height: 80rpx;
}
</style>

333
pages/shop/dataStatistics.vue

@ -0,0 +1,333 @@
<template>
<!-- 商家数据统计 -->
<view class="page1">
<view class="title">
<view class="title-sreach">
<view class="back-btn" @tap="back">
<uni-icons type="left" size="28"></uni-icons>
</view>
<view class="title-name">
数据统计
</view>
</view>
</view>
<view style="margin-top: -120rpx;">
<uni-datetime-picker style="margin-bottom:20rpx;" v-model="range" type="daterange" @change="searchList" />
</view>
<view style="width: 100%;margin: 20rpx auto;background: #fff;">
<view class="box">
<view style="width: 69%;">
<view style="width: 50rpx;height: 50rpx;float: left;margin-right: 20rpx;">
<uni-icons type="cart" size="24" color="red"></uni-icons>
</view>
销售金额
</view>
<view style="width: 30%;text-align: right;">
<text style="display: inline-block;width: 150rpx;text-align: center;">{{shopInfo.totalAmount}}</text>
</view>
</view>
<view class="box">
<view style="width: 69%;">
<view style="width: 50rpx;height: 50rpx;float: left;margin-right: 20rpx;">
<uni-icons type="cart" size="24" color="red"></uni-icons>
</view>
销量
</view>
<view style="width: 30%;text-align: right;">
<text style="display: inline-block;width: 150rpx;text-align: center;">{{shopInfo.totalJCount}}</text>
</view>
</view>
<view style="width: 100%;height: 10rpx;background: #eee;"></view>
<view class="box">
<view style="width: 69%;">
<view style="width: 50rpx;height: 50rpx;float: left;margin-right: 20rpx;">
<uni-icons type="wallet" size="24" color="red"></uni-icons>
</view>
销售利润
</view>
<view style="width: 30%;text-align: right;">
<text style="display: inline-block;width: 150rpx;text-align: center;">{{shopInfo.totalProfit==null?0:shopInfo.totalProfit}}</text>
</view>
</view>
<view style="width: 100%;height: 10rpx;background: #eee;"></view>
<view class="box">
<view style="width: 69%;">
<view style="width: 50rpx;height: 50rpx;float: left;margin-right: 20rpx;">
<uni-icons type="refreshempty" size="24" color="red"></uni-icons>
</view>
退货金额
</view>
<view style="width: 30%;text-align: right;">
<text style="display: inline-block;width: 150rpx;text-align: center;">{{shopInfo.returnTotalAmount}}</text>
</view>
</view>
<view class="box">
<view style="width: 69%;">
<view style="width: 50rpx;height: 50rpx;float: left;margin-right: 20rpx;">
<uni-icons type="refreshempty" size="24" color="red"></uni-icons>
</view>
退货数
</view>
<view style="width: 30%;text-align: right;">
<text style="display: inline-block;width: 150rpx;text-align: center;">{{shopInfo.returnTotalCount}}</text>
</view>
</view>
<view style="width: 100%;height: 10rpx;background: #eee;"></view>
<view class="box">
<view style="width: 69%;">
<view style="width: 50rpx;height: 50rpx;float: left;margin-right: 20rpx;">
<uni-icons type="staff" size="24" color="red"></uni-icons>
</view>
下单客户
</view>
<view style="width: 30%;text-align: right;">
<text style="display: inline-block;width: 150rpx;text-align: center;">{{shopInfo.totalCCount}}</text>
</view>
</view>
<!-- <view class="box" @tap="goDetail('rexiao')">
<view style="width: 69%;">
<view style="width: 50rpx;height: 50rpx;float: left;margin-right: 20rpx;">
<uni-icons type="fire" size="24" color="red"></uni-icons>
</view>
热销商品
</view>
<view style="width: 30%;">
<text style="display: inline-block;width: 150rpx;text-align: center;"></text>
<uni-icons type="right" size="24" color="#777"></uni-icons>
</view>
</view> -->
</view>
</view>
</template>
<script>
export default {
data() {
return {
range:[],
shopInfo:{
totalProfit:0,
returnTotalAmount:0,
saleReturnCost:0
}
};
},
onShow(){
if(this.range ==''){
this.getMonth();
}
this.getSaleInfo();
},
methods: {
getSaleInfo() {
this.shopInfo = {
totalProfit:0,
returnTotalAmount:0,
saleReturnCost:0
}
this.NB.sendRequest("/app/sale/getShopAll", {
pageVo: {
pageSize: 5,
pageNumber: 1
},
shopId:uni.getStorageSync('shopId'),
startTime:this.range[0],
endTime:this.range[1]
}, false, 'POST', 'application/json').then((res) => {
if (res.code == 200) {
this.shopInfo = res.result
} else {
this.tui.toast(res.message)
}
})
},
//1
getMonth() {
let date = new Date()
let year = date.getFullYear().toString() //''
let month = date.getMonth()+1 < 10 ? '0'+(date.getMonth()+1).toString():(date.getMonth()+1).toString() //''
let da = date.getDate() < 10 ? '0'+date.getDate().toString():date.getDate().toString() //''
let end = year + '-' + month + '-' + da //
let beg = year + '-' + month + '-01' //
this.range = [beg,end]
},
back() {
uni.navigateBack()
},
searchList() {
this.priceList = [];
this.getSaleInfo()
},
}
}
</script>
<style lang="scss">
page {
width: 100%;
height: 100%;
font-size: 24rpx;
background: #F5F8F5;
color: #00231C;
}
.page1 {
width: 100%;
height: 100%;
font-size: 24rpx;
position: relative;
}
.title {
background: url('https://jewel-shop.oss-cn-beijing.aliyuncs.com/8bc15960c2dc40268e295d6dd23aecce.png') no-repeat;
width: 100%;
height: 20%;
}
.title-sreach {
width: 100%;
display: flex;
height: 200rpx;
position: relative;
}
.back-btn {
padding-top: 110rpx;
}
.title-name {
padding-top: 110rpx;
font-size: 36rpx;
font-weight: 700;
flex: 1;
text-align: center;
}
.contentPadding {
padding: 28rpx 20rpx;
background-color: #fff;
color: #909399;
.title {
padding-left: 20rpx;
font-size: 32rpx;
color: #303133;
margin-bottom: 26rpx;
line-height: 66rpx;
image {
display: inline-block;
width: 40rpx;
vertical-align: middle;
}
.btn {
text-align: right;
width: 24%;
float: right;
font-size: 26rpx;
}
}
.grid-text {
font-size: 28rpx;
margin-bottom: 26rpx;
text-align: center;
}
}
.u-grid-item {
width: 30% !important;
height: 160rpx;
background: linear-gradient(#84C1FF, #C4E1FF) !important;
margin-left: 3%;
border-radius: 30rpx;
margin-top: 20rpx !important;
color: #fff !important;
}
.cardText {
font-size: 24rpx;
}
.priceText {
font-size: 28rpx;
}
.u-grid-item:nth-child(2) {
background: linear-gradient(#FFBB77, #FFDCB9) !important;
}
.u-grid-item:nth-child(3) {
background: linear-gradient(#1AFD9C, #7AFEC6) !important;
}
.u-grid-item:nth-child(4) {
background: linear-gradient(#1AFD9C, #7AFEC6) !important;
}
.u-grid-item:nth-child(5) {
background: linear-gradient(#FFBB77, #FFDCB9) !important;
}
.u-grid-item:nth-child(6) {
background: linear-gradient(#84C1FF, #C4E1FF) !important;
}
.u-count-num {
color: #FFF !important;
text-align:center;
}
.uni-date{
background: #fff;
}
.uni-tooltip-popup{
width: 180rpx;
}
.u-icon{
padding: 0 0 0 16rpx !important;
}
.u-zidingyi{
width: 22% !important;
height: 160rpx;
background: linear-gradient(#84C1FF, #C4E1FF) !important;
margin-left: 3%;
border-radius: 30rpx;
margin-top: 20rpx !important;
color: #fff !important;
text-align: center;
padding-top: 20rpx;
}
.u-zidingyi:nth-child(2) {
background: linear-gradient(#FFBB77, #C4E1FF) !important;
}
.u-zidingyi:nth-child(3) {
background: linear-gradient(#84C1FF, #7AFEC6) !important;
}
.u-zidingyi:nth-child(4) {
background: linear-gradient(#84C1FF, #C4E1FF) !important;
}
.box{
width: 100%;
height: 100rpx;
padding-left: 20rpx;
display: flex;
line-height: 100rpx;
font-size: 34rpx;
border-bottom: 1px solid #eee;
}
.tan-lirun{
margin-top: 20rpx;
width: 45%;
height: 120rpx;
display: flex;
flex-direction: column;
text-align: center;
float: left;
background-image: linear-gradient(#84C1FF, #C4E1FF) !important;
color: #fff;
border-radius: 20rpx;
}
</style>

570
pages/shop/goodsList.vue

@ -0,0 +1,570 @@
<template>
<!-- 商品列表 -->
<view class="page1">
<view class="title" style="z-index: 81;">
<view class="title-sreach">
<view class="back-btn" @tap="back">
<uni-icons type="left" size="28"></uni-icons>
</view>
<view class="title-search" @tap="goDetail('search')">
<uni-icons type="search" size="18" style="margin: 9rpx;"></uni-icons>
<input type="text" placeholder="搜索" @input="search" />
</view>
</view>
</view>
<view style="width: 100%;display: flex;height: 100%;padding-bottom: 60rpx;padding-top: 28%;position: fixed;top: 0;z-index:80;">
<view class="content-left">
<view class="left-box" v-for="(item, index) in indexList" :key="index"
:class="item.parentId ? 'left-box-hover':''" @tap="clickLeftBtn(index)">
<text style="width: 100%;height: 90rpx;line-height: 90rpx;display: inline-block;overflow: hidden;"
:class="item.parentId ? 'red' :''">{{item.categoryName}}</text>
</view>
</view>
<view class="content-right" style="padding-bottom: 140rpx;margin-bottom: 200rpx;">
<view class="right-box" v-for="(item,index) in shopList" :key="index">
<view style="position: relative;display: flex;">
<view class="box-left" @tap="largeImg(item)">
<view v-if="(item.buyCountNew!= null && item.buyCountNew!= undefined)" style="position: absolute;left: 110rpx;color: #fff;background: red;width: 45rpx;height: 40rpx;font-size: 28rpx;text-align: center;line-height: 40rpx;border-radius: 10rpx;">
{{item.buyCountNew}}
</view>
<img class="img-radius" :src="item.productPicture" alt="" v-if="item.productPicture">
<view class="noPic" v-else>暂无图片</view>
</view>
<view class="box-right">
<view class="box-right-name">
{{item.productName == null ?'':item.productName}}
<text style="color: red;" v-if="item.delFlag == 0">(已下架)</text>
</view>
<view class="box-right-num"></view>
<view class="box-right-price">
<view class="price-box">
<text>{{item.lunchBox}}</text>
<text>餐盒费</text>
</view>
<view class="price-box">
<text>{{item.startPayNum}}</text>
<text>起售数量</text>
</view>
<view class="price-box" @tap="changeShow(index,'shopList')" style="flex: 1;text-align: right;padding-top: 26rpx;">
<uni-icons type="down" size="18"></uni-icons>
</view>
</view>
</view>
</view>
<view class="show-box" v-show="item.isShow">
<view class="show-text" @tap="goDetail('goods',item)" style="border-right: 1px solid #fff;">
<uni-icons type="compose" size="18"></uni-icons>
编辑
</view>
<view class="show-text" @tap="isPush('shopList',index,item,item.isPush==1?0:1)" style="border-right: 1px solid #fff;">
<uni-icons type="hand-up" size="18"></uni-icons>
{{item.isPush == 0?'设为推荐':'取消推荐'}}
</view>
<view class="show-text" @tap="isMust('shopList',index,item,item.isMust==1?0:1)" style="border-right: 1px solid #fff;">
<uni-icons type="star" size="18"></uni-icons>
{{item.isMust == 0?'设为必点':'取消必点'}}
</view>
<view class="show-text" @tap="upDown('shopList',index,item,item.delFlag==1?0:1)" style="border-right: 1px solid #fff;">
<uni-icons type="upload" size="18"></uni-icons>
{{item.delFlag == 1?'下架':'上架'}}
</view>
<view class="show-text" @tap="remove(item)">
<uni-icons type="trash" size="18"></uni-icons>
删除
</view>
</view>
</view>
<view class="right-box" v-for="(item,index) in shopList1" :key="index">
<view style="position: relative;display: flex;">
<view class="box-left" @tap="largeImg(item)">
<view v-if="(item.buyCountNew!= null && item.buyCountNew!= undefined)" style="position: absolute;left: 110rpx;color: #fff;background: red;width: 45rpx;height: 40rpx;font-size: 28rpx;text-align: center;line-height: 40rpx;border-radius: 10rpx;">
{{item.buyCountNew}}
</view>
<img class="img-radius" :src="item.productPicture" alt="" v-if="item.productPicture">
<view class="noPic" v-else>暂无图片</view>
</view>
<view class="box-right">
<view class="box-right-name">
{{item.productName == null ?'':item.productName}}
</view>
<view class="box-right-num"></view>
<view class="box-right-price">
<view class="price-box">
<text>{{item.lunchBox}}</text>
<text>餐盒费</text>
</view>
<view class="price-box">
<text>{{item.startPayNum}}</text>
<text>起售数量</text>
</view>
<view class="price-box" @tap="changeShow(index,'shopList1')" style="flex: 1;text-align: right;padding-top: 26rpx;">
<uni-icons type="down" size="18"></uni-icons>
</view>
</view>
</view>
</view>
<view class="show-box" v-show="item.isShow">
<view class="show-text" @tap="goDetail('goods',item)" style="border-right: 1px solid #fff;">
编辑
</view>
<view class="show-text" @tap="isPush('shopList1',index,item,item.isPush==1?0:1)" style="border-right: 1px solid #fff;">
<uni-icons type="hand-up" size="18"></uni-icons>
{{item.isPush == 0?'设为推荐':'取消推荐'}}
</view>
<view class="show-text" @tap="isMust('shopList1',index,item,item.isMust==1?0:1)" style="border-right: 1px solid #fff;">
<uni-icons type="star" size="18"></uni-icons>
{{item.isMust == 0?'设为必点':'取消必点'}}
</view>
<view class="show-text" @tap="upDown('shopList1',index,item,item.delFlag==1?0:1)" style="border-right: 1px solid #fff;">
<uni-icons type="upload" size="18"></uni-icons>
{{item.delFlag == 1?'下架':'上架'}}
</view>
<view class="show-text" @tap="remove(item)" style="border-right: 1px solid #fff;">
<uni-icons type="trash" size="18"></uni-icons>
删除
</view>
</view>
</view>
</view>
</view>
<view class="bottom-box">
<view class="bottom-btn" @tap="goDetail('goods')" style="background: rgba(0, 35, 28, 1);color: rgba(166, 255, 234, 1);">新增商品</view>
<view class="bottom-btn" @tap="goDetail('type')">新增分类</view>
</view>
<u-loadmore :status="status" />
</view>
</template>
<script>
export default {
data() {
return {
indexList: [],
shopList: [],
shopList1: [],
pageNum: 1,
searchName: '',
shopId:'',
categoryId: '',
}
},
filters: {
},
onShow() {
this.getGategoryList()
},
onLoad(option) {
this.shopId = uni.getStorageSync('shopId')
},
onReachBottom() {
if (this.pageNum >= this.pages) return;
// this.status = 'loading';
this.pageNum++;
if(this.gateType == 'search'){
this.getShareList('search');
}else{
this.getShareList();
}
},
methods: {
back() {
uni.navigateBack()
},
//
search(e) {
this.pageNum = 1
this.shopList1 = []
this.shopList = []
if (e == '') {
this.searchName = ""
this.getShareList()
} else {
this.searchName = e
this.getShareList('search')
}
},
changeShow(index,type){
console.log("1111",index)
console.log("1111",type)
if(type == 'shopList'){
this.shopList[index].isShow = !this.shopList[index].isShow
console.log(this.shopList[index])
}else{
this.shopList1[index].isShow = !this.shopList1[index].isShow
console.log(this.shopList1[index])
}
this.$forceUpdate()
},
isPush(type,index,item,value) {
this.NB.sendRequest("/app/product/isPush", {
id: item.id,
isPush:value
}, false, 'POST', 'application/x-www-form-urlencoded').then((res) => {
if (res.code == 200) {
if(type == 'shopList'){
this.shopList[index].isPush = value
}else{
this.shopList1[index].isPush = value
}
this.tui.toast('设置成功')
} else {
this.tui.toast(res.message)
}
}).catch((res) => {})
},
remove(v) {
let that = this;
uni.showModal({
title: '提示',
content: '确定要删除该商品吗?',
success: function (res) {
if (res.confirm) {
that.NB.sendRequest("/app/product/delById", {
id: v.id
}, false, 'POST', 'application/x-www-form-urlencoded').then((res) => {
if (res.code == 200) {
that.getShareList()
that.tui.toast('删除成功')
} else {
that.tui.toast(res.message)
}
}).catch((res) => {})
}
}
});
},
isMust(type,index,item,value) {
this.NB.sendRequest("/app/product/isMust", {
id: item.id,
isMust:value
}, false, 'POST', 'application/x-www-form-urlencoded').then((res) => {
if (res.code == 200) {
if(type == 'shopList'){
this.shopList[index].isMust = value
}else{
this.shopList1[index].isMust = value
}
this.tui.toast('设置成功')
} else {
this.tui.toast(res.message)
}
}).catch((res) => {})
},
upDown(type,index,item,value) {
if(value == 0){
this.NB.sendRequest("/app/product/down", {
id: item.id
}, false, 'POST', 'application/x-www-form-urlencoded').then((res) => {
if (res.code == 200) {
if(type == 'shopList'){
this.shopList[index].delFlag = value
}else{
this.shopList1[index].delFlag = value
}
this.tui.toast('设置成功')
} else {
this.tui.toast(res.message)
}
}).catch((res) => {})
}else{
this.NB.sendRequest("/app/product/up", {
id: item.id
}, false, 'POST', 'application/x-www-form-urlencoded').then((res) => {
if (res.code == 200) {
if(type == 'shopList'){
this.shopList[index].delFlag = value
}else{
this.shopList1[index].delFlag = value
}
this.tui.toast('设置成功')
} else {
this.tui.toast(res.message)
}
}).catch((res) => {})
}
},
goDetail(type,item){
let url=""
if(type == 'goods'){
url = '/pages/shop/addGoods?dataList='+ JSON.stringify(item)
}else{
url = '/pages/shop/addType'
}
uni.navigateTo({
url:url
})
},
//
getShareList(type) {
let data = {}
if (type == 'search') {
this.gateType = 'search'
data = {
categoryId: "",
searchStr: this.searchName,
pageNum: this.pageNum,
pageSize: '10'
}
} else {
this.gateType = ''
data = {
categoryId: this.categoryId,
searchStr: this.searchName,
pageNum: this.pageNum,
pageSize: '10'
}
}
let that = this
this.NB.sendRequest("/app/product/getShareList", data, false, 'POST', 'application/json').then((res) => {
if (res.code == 200) {
if (type == 'search') {
this.shopList = []
this.status = 'nomore';
if (this.pages == 1) {
this.shopList1 = res.result.records
} else {
this.shopList1 = [...this.shopList1, ...res.result.records]
}
for(let i=0;i<this.shopList1.length;i++){
this.shopList1[i].isShow = false
}
this.pages = res.result.pages
} else {
this.shopList1 = []
this.status = 'nomore';
if (this.pages == 1) {
this.shopList = res.result.records
} else {
this.shopList = [...this.shopList, ...res.result.records]
}
for(let i=0;i<this.shopList.length;i++){
this.shopList[i].isShow = false
}
this.pages = res.result.pages
}
} else {
this.tui.toast(res.message)
}
}).catch((res) => {})
},
//
clickLeftBtn(index) {
for (var i = 0; i < this.indexList.length; i++) {
if (i == index) {
this.indexList[i].parentId = true
} else {
this.indexList[i].parentId = false
}
}
this.categoryId = this.indexList[index].id
this.pageNum = 1
this.searchName = ""
this.shopList1 = []
this.shopList = []
this.getShareList()
},
//
getGategoryList() {
this.NB.sendRequest("/app/productCategory/list", {
shopId:this.shopId
}, false, 'get', 'application/json').then((res) => {
if (res.code == 200) {
this.indexList = res.result;
for (var i = 0; i < this.indexList.length; i++) {
if (i == 0) {
this.indexList[i].parentId = true
} else {
this.indexList[i].parentId = false
}
}
this.categoryId = this.indexList[0].id
this.getShareList();
} else {
this.tui.toast(res.message)
}
}).catch((res) => {})
},
}
}
</script>
<style lang="scss">
page {
width: 100%;
height: 100%;
font-size: 24rpx;
background: #F5F8F5;
color: #00231C;
}
.page1 {
width: 100%;
height: 100%;
font-size: 24rpx;
position: relative;
}
.title{
background: url('https://jewel-shop.oss-cn-beijing.aliyuncs.com/8bc15960c2dc40268e295d6dd23aecce.png') no-repeat;
width: 100%;
height: 13%;
position: fixed;
top: 0;
}
.title-sreach{
width: 75%;
display: flex;
height: 200rpx;
}
.back-btn{
padding-top: 110rpx;
}
.title-search{
margin-top: 110rpx;
display: flex;
background: #fff;
height: 54rpx;
margin-left: 20rpx;
border-radius: 54rpx;
flex: 1;
input{
height: 54rpx;
line-height: 54rpx;
}
}
.content-left {
width: 170rpx;
background: #eee;
overflow: scroll;
}
.left-box {
width: 100%;
height: 90rpx;
font-size: 30rpx;
text-align: center;
line-height: 90rpx;
border-bottom: 1px solid #fff;
}
.left-box-hover {
width: 100%;
height: 90rpx;
font-size: 30rpx;
text-align: center;
line-height: 90rpx;
border-bottom: 1px solid #fff;
background-color: #fff;
}
.red {
border-right: 6rpx solid red;
}
.content-right {
flex: 1;
overflow-y: scroll;
height: 100%;
background: #fff;
}
.right-box {
width: 100%;
height: auto;
border-bottom: 1px solid #eee;
}
.box-left {
width: 130rpx;
height: 131rpx;
background-size: 100%;
margin: 25rpx 30rpx 35rpx 10rpx;
border-radius: 20rpx;
}
.box-left img {
width: 100%;
height: 100%;
}
.box-right {
margin-top: 17rpx;
flex: 1;
}
.box-right-name {
font-size: 30rpx;
font-weight: bold;
}
.box-right-num {
padding: 5rpx 0;
color: #777;
text-align: right;
padding-right: 20rpx;
height: 40rpx;
}
.box-right-price {
display: flex;
font-size: 25rpx;
text-align: center;
}
.price-box {
display: flex;
flex-direction: column;
margin-right: 20rpx;
}
.price-box text:first-child {
color: #ffa200
}
.bottom-box {
width: 100%;
height: 140rpx;
display: flex;
background: #fff;
z-index: 98;
position: fixed;
bottom: 0;
display: flex;
padding-top: 20rpx;
}
.bottom-btn {
width: 50%;
height: 90rpx;
line-height: 90rpx;
border-radius: 90rpx;
font-size: 28rpx;
font-weight: 700;
background: linear-gradient(90deg, rgba(227, 255, 150, 1), rgba(166, 255, 234, 1));
text-align: center;
margin: 0 20rpx;
}
.show-box{
display: flex;
height: 100rpx;
background: #eee;
}
.show-text{
display: flex;
flex-direction: column;
text-align: center;
flex: 1;
padding-top: 14rpx;
}
</style>

271
pages/shop/orderDetail.vue

@ -0,0 +1,271 @@
<template>
<!-- 商家订单详情 -->
<view class="page1">
<view class="title">
<view class="title-sreach">
<view class="back-btn" @tap="back">
<uni-icons type="left" size="28"></uni-icons>
</view>
<view class="title-name">
订单详情
</view>
</view>
</view>
<view class="content">
<view class="box1" style="display: flex;font-size: 14px;font-weight: 700;">
<text>{{'#'+data.numberCode}}</text>
<text style="margin: 0 10px;">期望送达</text>
<text>明天 06:30</text>
<text style="flex: 1;text-align: right;color: red;">
{{data.status == 0?'待支付':data.status == 1?' 待成团':data.status == 2?'待消费':data.status == 3?'待接单':data.status == 4?'待取货':data.status == 5?'待送达':data.status == 6?'已完成':data.status == 7?'待退款':data.status == 8?'已退款':data.status == 9?'已取消':data.status == 11?'售后中':data.status == 12?'已售后':""}}
</text>
</view>
<view class="box1" style="display: flex;height: 50px;line-height: 50px;padding: 0 10px;">
<view style="border: 1px solid #48D1CC;height: 25px;line-height: 25px;padding: 0 10px;border-radius: 10px;margin-top: auto;margin-bottom: auto;color: #48D1CC;font-weight: 700;">
{{data.deliveryType == 2?'自取订单':'配送订单'}}
</view>
<view v-if="data.deliveryType == 1" style="display: flex;flex: 1;padding-left: 10px;">
<text style="flex: 1;">配送员{{data.deliveryInfo.workerName}}</text>
<view class="">
<img @tap="makeCall(data.deliveryInfo.workerPhone)" src="https://jewel-shop.oss-cn-beijing.aliyuncs.com/869a7af6a1c24bf3a0d523c4a18b55c6.png" alt="" style="width: 30px;height: 30px;margin-top: 10px;" />
</view>
</view>
</view>
<view class="box1" v-if="data.deliveryType == 1" style="display: flex;">
<view style="flex: 1;">
<view style="font-weight: 700;height: 25px;">
收货人{{data.deliveryInfo.receiverName}}
</view>
<view style="color: #777;height: 35px;">
{{data.deliveryInfo.receiverAddress}}
</view>
</view>
<view class="">
<img @tap="makeCall(data.deliveryInfo.receiverPhone)" src="https://jewel-shop.oss-cn-beijing.aliyuncs.com/869a7af6a1c24bf3a0d523c4a18b55c6.png" alt="" style="width: 30px;height: 30px;margin-top: 14px;" />
</view>
</view>
<view class="box1">
<view style="border-bottom: 1px solid #eee;padding-bottom: 10px;">
<view style="font-size: 16px;height: 30px;">
商品 <text style="font-size: 14px;color: #777;">{{data.goodsNum}}</text>
</view>
<view v-for="(item,index) in data.goodsList" :key="index" style="display: flex;height: 20px;line-height: 20px;">
<view style="flex: 1;">
{{item.productName}}
</view>
<view style="width: 30px;">
{{'x'+ item.quantity}}
</view>
<view style="width: 50px;text-align: right;">
{{'¥'+ item.price}}
</view>
</view>
</view>
<view class="">
<view style="display: flex;height: 30px;line-height: 30px;">
<view style="flex: 1;">
商品金额
</view>
<view class="">
{{'¥' + data.goodsAmount}}
</view>
</view>
<view style="display: flex;height: 30px;line-height: 30px;">
<view style="flex: 1;">
配送费
</view>
<view class="">
{{'¥' + data.deliveryFee}}
</view>
</view>
<view style="display: flex;height: 30px;line-height: 30px;">
<view style="flex: 1;">
客户实际支付
</view>
<view class="">
{{'¥'+ data.totalAmount}}
</view>
</view>
<view style="display: flex;height: 30px;line-height: 30px;">
<view style="flex: 1;">
平台服务费
</view>
<view class="">
12.00假的
</view>
</view>
</view>
</view>
<view class="box1">
<view class="">
<view style="display: flex;height: 30px;line-height: 30px;">
<view style="width: 70px;">
订单编号
</view>
<view style="flex: 1;text-align: right;">
{{data.id}}
</view>
</view>
<view style="display: flex;height: 30px;line-height: 30px;">
<view style="width: 70px;">
下单时间
</view>
<view style="flex: 1;text-align: right;">
{{data.createTime | formatISOTime}}
</view>
</view>
<view style="display: flex;height: 30px;line-height: 30px;">
<view style="width: 70px;">
用户账号
</view>
<view style="flex: 1;text-align: right;">
13521030111假的
</view>
</view>
</view>
</view>
</view>
<view class="box1 bottom">
<view style="height: 30px;line-height: 30px;display: flex;border-bottom: 1px solid #eee;font-size: 14px;">
<view style="flex: 1;">
预计收入
</view>
<view style="color: red;font-weight: 700;">
10.32假的
</view>
</view>
<view style="margin-top: 10px;">
<view class="btn">
打印小票
</view>
<view class="btn" style="background: rgba(0, 35, 28, 1);color: rgba(166, 255, 234, 1);">
取消订单
</view>
</view>
</view>
</view>
</template>
<script>
export default {
data() {
return {
data:{}
}
},
filters:{
formatISOTime(isoString) {
const date = new Date(isoString);
const year = date.getFullYear();
const month = (date.getMonth() + 1).toString().padStart(2, '0');
const day = date.getDate().toString().padStart(2, '0');
const hours = date.getHours().toString().padStart(2, '0');
const minutes = date.getMinutes().toString().padStart(2, '0');
const seconds = date.getSeconds().toString().padStart(2, '0');
return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
}
},
onShow() {
},
onLoad(option) {
this.shopId = option.id
this.getDetail()
},
methods: {
getDetail(){
let that = this
this.NB.sendRequest("/mall/order/detail/"+ this.shopId, {}, false, 'get', 'application/json').then((res) => {
if (res.code == 200) {
that.data = res.result
that.data.goodsNum = 0
for(let m=0;m<that.data.goodsList.length;m++){
that.data.goodsNum += that.data.goodsList[m].quantity
}
that.$forceUpdate()
} else {
that.tui.toast(res.message);
return;
}
uni.hideLoading();
}).catch((res) => {});
},
makeCall(phone){
uni.makePhoneCall({
phoneNumber: phone
});
},
back() {
uni.navigateBack()
},
}
}
</script>
<style>
page {
width: 100%;
height: 100%;
font-size: 24rpx;
background: #F5F8F5;
color: #00231C;
}
.page1 {
width: 100%;
height: 100%;
font-size: 24rpx;
position: relative;
}
.title {
background: url('https://jewel-shop.oss-cn-beijing.aliyuncs.com/8bc15960c2dc40268e295d6dd23aecce.png') no-repeat;
width: 100%;
height: 20%;
}
.title-sreach {
width: 100%;
display: flex;
height: 200rpx;
position: relative;
}
.back-btn {
padding-top: 110rpx;
}
.title-name {
padding-top: 110rpx;
font-size: 36rpx;
font-weight: 700;
flex: 1;
text-align: center;
}
.content{
margin: -140rpx auto;
}
.box1 {
width: 95%;
margin: 20rpx auto;
background: #fff;
border-radius: 20rpx;
padding: 20rpx;
}
.bottom{
position: fixed;
bottom: 0;
}
.btn{
height: 25px;
width: 65px;
line-height: 25px;
background: linear-gradient(90deg, #e3ff96, #a6ffea);
text-align: center;
border-radius: 7px;
font-weight: 700;
float: right;
margin-left: 10px;
}
</style>

189
pages/shop/shopBill.vue

@ -0,0 +1,189 @@
<template>
<!-- 商家账单列表 -->
<view class="page1">
<view class="title">
<view class="title-sreach">
<view class="back-btn" @tap="back">
<uni-icons type="left" size="28"></uni-icons>
</view>
<view class="title-name">
账单结算
</view>
</view>
</view>
<view style="margin: -120rpx auto 0;">
<view class="">
<view class="content11">
2026
</view>
<view class="box1" @tap="goDetail">
<view class="content22">
<view class="">
10/25-10/25账单
</view>
<view class="">
<text>0</text>
<uni-icons type="right" size="12"></uni-icons>
</view>
</view>
<view style="border-bottom: 1px solid #eee;">
<view class="content33">
<view class="content44">
商品金额
</view>
<view class="">
0.00
</view>
</view>
<view class="content33">
<view class="content44">
餐盒费
</view>
<view class="">
0.00
</view>
</view>
<view class="content33">
<view class="content44">
活动成本
</view>
<view class="">
0.00
</view>
</view>
<view class="content33">
<view class="content44">
平台服务费
</view>
<view class="">
0.00
</view>
</view>
</view>
<view class="">
<view class="content33">
<view class="content44">
结算金额
</view>
<view class="">
0.00
</view>
</view>
<view class="content33">
<view class="content44">
本期期初
</view>
<view class="">
0.00
</view>
</view>
<view class="content33">
<view class="content44">
实际打款金额
</view>
<view class="">
0.00
</view>
</view>
</view>
</view>
</view>
</view>
</view>
</template>
<script>
export default {
data() {
return {
}
},
onShow() {
},
onLoad(option) {
},
methods: {
goDetail(){
uni.navigateTo({
url:'/pages/shop/shopSettlementDetail'
})
},
back() {
uni.navigateBack()
},
}
}
</script>
<style lang="scss">
page {
width: 100%;
height: 100%;
font-size: 24rpx;
background: #F5F8F5;
color: #00231C;
}
.page1 {
width: 100%;
height: 100%;
font-size: 24rpx;
position: relative;
}
.title {
background: url('https://jewel-shop.oss-cn-beijing.aliyuncs.com/8bc15960c2dc40268e295d6dd23aecce.png') no-repeat;
width: 100%;
height: 20%;
}
.title-sreach {
width: 100%;
display: flex;
height: 200rpx;
position: relative;
}
.back-btn {
padding-top: 110rpx;
}
.title-name {
padding-top: 110rpx;
font-size: 36rpx;
font-weight: 700;
flex: 1;
text-align: center;
}
.box1 {
width: 95%;
margin: 0 auto 20rpx;
background: #fff;
border-radius: 20rpx;
padding: 20rpx;
}
.content11{
height: 70rpx;
line-height: 70rpx;
padding-left: 40rpx;
font-size: 28rpx;
font-weight: 700;
}
.content22{
display: flex;
height: 60rpx;
line-height: 44rpx;
border-bottom: 1px solid #eee;
font-size: 26rpx;
font-weight: 600;
}
.content33{
height: 50rpx;
line-height: 50rpx;
display: flex;
}
.content44{
flex: 1;
}
</style>

434
pages/shop/shopEvaluate.vue

@ -0,0 +1,434 @@
<template>
<view class="page1">
<view class="title">
<view class="title-sreach">
<view class="back-btn" @tap="back">
<uni-icons type="left" size="28"></uni-icons>
</view>
<view class="title-name">
商家评价
</view>
</view>
</view>
<view class="content">
<view class="shop-rate">
<view class="rate-left">
<view class="rate-num">
{{shopItem.shopScore}}
</view>
<view class="rate-star">
<uni-rate :disabled="true" size="20" disabledColor="rgba(255, 184, 84, 1)" :value="shopItem.shopScore" />
</view>
</view>
</view>
<view class="">
<view class="menu-list">
<view class="menu1" @tap="checkTab(index)" v-for="(item,index) in menuList" :key="index"
:style="{'font-size':item.checked?'40rpx':'30rpx','color':item.checked?'rgba(0, 35, 28, 1)':'#777','width':index == 0?'160rpx':'180rpx'}">
<view :style="{'width':index == 0?'160rpx':'180rpx'}" style="text-align: left;">
{{item.name}} {{item.num}}
</view>
<img v-if="item.checked" class="checked-img"
src="https://jewel-shop.oss-cn-beijing.aliyuncs.com/4bb5fc7725cb4a7a84d1d3a15f05b39c.png"
alt="" />
</view>
</view>
</view>
<view class="evaluate-list" v-for="(item,index) in shopComments" :key="index">
<view class="eval-title">
<view class="eval-icon">
<img :src="item.createByIcon"
alt="" />
</view>
<view class="eval-name">
<view class="name1">
{{item.createByName}}
</view>
<view class="eval-time">
{{item.createTime}}
</view>
</view>
</view>
<view class="eval-content">
<view style="display: flex;height: 50rpx;line-height: 50rpx;font-size: 24rpx;">
商品
<view style="padding: 12rpx 0 0 10rpx;">
<uni-rate v-model="item.score" size="12" />
</view>
</view>
<view class="eval-text">
{{item.remark}}
</view>
<view class="eval-img">
<img @tap="largeImg" :src="item.picture" alt="">
</view>
<view class="reply-card" :class="{'expanded': isExpanded}" v-for="(item1,index1) in item.comments" :key="index1">
<!-- 标题行商家回复 + 展开/收起按钮 -->
<view class="reply-header">
<!-- 回复内容区域动态类控制展开/折叠 -->
<view class="reply-content" :class="{ collapsed: !isExpanded, expanded: isExpanded }">
<text>{{item1.createByName}} : {{ item1.remark }}</text>
</view>
<view class="reply-expand-btn" @click="toggleReply">
<text v-if="!isExpanded">展开</text>
<text v-else>收起</text>
</view>
</view>
</view>
</view>
</view>
</view>
<!-- 查看大图弹出层 -->
<uni-popup ref="imgPopup" background-color="#fff">
<view class="img-popup-content">
<img :src="bigImg" alt="" style="width: 100%;height: 100%;">
</view>
</uni-popup>
</view>
</template>
<script>
export default {
data() {
return {
isExpanded: false,
bigImg: '',
shopItem:{},
pageNum:1,
searchAll:true,
total:0,
shopComments:[],
searchForm:{
shopId:'',
pageNum: 1,
score:0,
picture:0,
pageSize: '10'
},
menuList: [{
name: '全部',
num: "",
checked: true
}, {
name: '有图/视频',
num: '',
checked: false
}, {
name: '中差评',
num: '',
checked: false
}]
}
},
components: {
},
onLoad(option) {
this.shopItem = JSON.parse(uni.getStorageSync('area')).shop
console.log('shop',this.shopItem)
this.getshopComments(this.shopItem.shopId)
},
onShow() {
},
methods: {
getshopComments(id){
let that = this
this.searchForm.shopId = id
this.NB.sendRequest("/app/comment/getCommentList", this.searchForm, false, 'POST', 'application/json').then((res) => {
if (res.code == 200) {
if (that.pageNum == 1) {
that.shopComments = res.result.records
} else {
that.shopComments = [...that.shopComments, ...res.result.records]
}
that.$forceUpdate()
if(this.searchAll){
that.menuList[0].num = res.result.total
}
} else {
that.tui.toast(res.message)
return
}
uni.hideLoading()
}).catch((res) => {})
},
toggleReply() {
this.isExpanded = !this.isExpanded;
},
checkTab(index) {
for (let i = 0; i < this.menuList.length; i++) {
if (i == index) {
this.menuList[i].checked = true
} else {
this.menuList[i].checked = false
}
}
if(index == 0){
this.searchForm.picture = 0
this.searchForm.score = 0
}else if(index ==1){
this.searchAll = false
this.searchForm.picture = 1
this.searchForm.score = 0
}else{
this.searchAll = false
this.searchForm.picture = 0
this.searchForm.score = 1
}
this.getshopComments(this.shopItem.id)
},
//
largeImg(img) {
this.bigImg = 'https://jewel-shop.oss-cn-beijing.aliyuncs.com/00b1f011787c4549bbea650d95a4eb39.png'
this.$refs.imgPopup.open()
},
back() {
uni.navigateBack()
}
}
}
</script>
<style lang="scss">
page {
width: 100%;
height: 100%;
font-size: 24rpx;
background: #F5F8F5;
color: #00231C;
}
.page1 {
width: 100%;
height: 100%;
font-size: 24rpx;
position: relative;
}
.title {
background: url('https://jewel-shop.oss-cn-beijing.aliyuncs.com/8bc15960c2dc40268e295d6dd23aecce.png') no-repeat;
width: 100%;
height: 54%;
}
.title-sreach {
width: 100%;
display: flex;
height: 200rpx;
position: relative;
}
.back-btn {
padding-top: 110rpx;
}
.title-name {
padding-top: 110rpx;
font-size: 36rpx;
font-weight: 700;
flex: 1;
text-align: center;
}
.content {
position: absolute;
top: 200rpx;
width: 95%;
margin-left: 2.5%;
}
.shop-rate {
display: flex;
padding-bottom: 30rpx;
}
.rate-left {
display: flex;
flex: 1;
}
.rate-num {
font-size: 86rpx;
font-weight: 700;
background: linear-gradient(90deg, rgba(255, 77, 0, 1), rgba(255, 184, 84, 1));
background-clip: text;
color: transparent;
}
.rate-right {
display: flex;
width: 160rpx;
height: 100rpx;
line-height: 40rpx;
font-size: 36rpx;
text-align: center;
font-weight: 700;
border-left: 1px solid #eee;
}
.rate-star {
height: 100rpx;
padding: 32rpx 20rpx;
}
.right1 {
margin: 20rpx 0 0 5%;
width: 45%;
}
.menu-list {
height: 100rpx;
width: 100%;
display: flex;
overflow-y: hidden;
padding-top: 30rpx;
border-top: 1px solid #eee;
}
.checked-img {
width: 100%;
height: 20rpx;
position: absolute;
bottom: 0;
left: 0;
}
.menu1 {
width: 180rpx;
height: 70rpx;
position: relative;
margin-right: 20rpx;
line-height: 70rpx;
flex: 1;
}
.evaluate-list {
margin-top: 40rpx;
}
.eval-title {
width: 100%;
height: 80rpx;
display: flex;
}
.eval-icon {
height: 80rpx;
width: 80rpx;
img {
width: 100%;
height: 100%;
background-size: 100%;
}
}
.eval-name {
margin-left: 20rpx;
}
.name1 {
font-size: 28rpx;
line-height: 50rpx;
font-weight: 700;
}
.eval-rate {
display: flex;
margin: 20rpx 0 0 100rpx;
height: 48rpx;
line-height: 40rpx;
}
.eval-content {
margin-left: 100rpx;
font-size: 28rpx;
color: #777;
line-height: 48rpx;
}
.eval-img {
display: flex;
width: 100%;
overflow-x: scroll;
margin-top: 20rpx;
img {
width: 100rpx;
height: 100rpx;
background-size: 100%;
margin-right: 20rpx;
}
}
/* 卡片整体样式(可根据需要调整外间距) */
.reply-card {
border-radius: 12rpx;
background-color: #eee;
width: 100%;
box-sizing: border-box;
margin-top:20rpx;
}
/* 标题行:左标签 + 右按钮 */
.reply-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 16rpx;
}
.reply-label {
font-size: 28rpx;
font-weight: 500;
color: #333;
}
.reply-expand-btn {
font-size: 24rpx;
padding: 4rpx 12rpx;
}
/* 回复内容基础样式 */
.reply-content {
font-size: 26rpx;
color: #555;
padding: 12rpx;
transition: all 0.2s;
height: 70rpx;
flex: 1;
}
/* 折叠状态:单行省略 */
.reply-content.collapsed {
display: -webkit-box;
-webkit-line-clamp: 1;
-webkit-box-orient: vertical;
overflow: hidden;
text-overflow: ellipsis;
}
/* 展开状态:固定高度100px,可滚动 */
.reply-content.expanded {
display: block;
height: 200rpx;
/* 固定高度100px */
overflow-y: auto;
/* 内容超长时滚动 */
/* 重置折叠相关属性 */
-webkit-line-clamp: unset;
-webkit-box-orient: unset;
text-overflow: clip;
}
/* 滚动条美化(可选) */
.reply-content.expanded::-webkit-scrollbar {
width: 12rpx;
}
.reply-content.expanded::-webkit-scrollbar-thumb {
background-color: #ccc;
border-radius: 20rpx;
}
</style>

330
pages/shop/shopOrderList.vue

@ -0,0 +1,330 @@
<template>
<!-- 商家订单列表 -->
<view class="page1">
<view class="title">
<view class="title-sreach">
<view class="back-btn" @tap="back" :style="{'top': menuButtonInfo.top +'px'}">
<uni-icons type="left" size="28"></uni-icons>
</view>
<view class="title-name" :style="{'padding-top': menuButtonInfo.top +'px'}">
商家订单
</view>
</view>
</view>
<view class="title-tab">
<scroll-view class="status-scroll-view" scroll-x enable-flex :show-scrollbar="false"
:scroll-with-animation="true">
<view class="status-list">
<view v-for="(item, index) in statusList" :key="index" class="status-item"
:class="{ 'active': currentIndex == item.value }" @click="handleStatusClick(item.value,item.value)">
<text class="status-text">{{ item.name }}</text>
</view>
</view>
</scroll-view>
</view>
<view class="box1" @tap="goDetail(item.id)" v-for="(item,index) in orderList" :key="index">
<view style="display: flex;height: 50rpx;border-bottom: 1px solid #eee;">
<view>
{{'#' + item.numberCode}}
</view>
<view style="flex: 1;display: flex;padding-left: 20rpx;">
{{item.createTime | formatISOTime}}
<!-- <text>已退款</text> -->
</view>
<view>
{{item.status == 0?'待支付':item.status == 1?' 待成团':item.status == 2?'待消费':item.status == 3?'待接单':item.status == 4?'待取货':item.status == 5?'待送达':item.status == 6?'已完成':item.status == 7?'待退款':item.status == 8?'已退款':item.status == 9?'已取消':item.status == 11?'售后中':item.status == 12?'已售后':""}}
</view>
</view>
<view style="height: 120rpx;padding-top: 20rpx;">
<view style="height: 50rpx;line-height: 50rpx;font-size: 28rpx;font-weight: 700;display: flex;">
商品 <text><text>{{item.goodsNum}}</text></text> <text style="color: red;flex: 1;text-align: right;">已出餐</text>
</view>
<view style="display: flex;" v-for="(item1,index1) in item.goodsList" :key="index">
<view style="flex: 1;">
{{item1.productName}}
</view>
<view style="width: 100rpx;">
{{'X' + item1.quantity}}
</view>
<view>
{{'¥'+ item1.price}}
</view>
</view>
</view>
</view>
</view>
</template>
<script>
export default {
data() {
return {
loadStatus: 'more',
searchForm:{
pageNum:1,
pageSize:10,
shopName:'',
searchStatus:10,
shopId:uni.getStorageSync('shopId'),
regionId:JSON.parse(uni.getStorageSync('shop')).shop.shopArea
},
totalPages: 1,
orderList:[],
currentIndex: 10,
menuButtonInfo: {},
statusList: [{
name: '全部',
value: 10,
checked: true
},{
name: '待支付',
value: 0,
checked: true
},
{
name: '待成团',
value: 1,
checked: false
},
{
name: '待消费',
value: 2,
checked: false
},
{
name: '待接单',
value: 3,
checked: false
},
{
name: '待取货',
value: 4,
checked: false
},
{
name: '待送达',
value: 5,
checked: false
},
{
name: '已完成',
value: 6,
checked: false
},
{
name: '待退款',
value: 7,
checked: false
},
{
name: '已退款',
value: 8,
checked: false
},
{
name: '已取消',
value: 9,
checked: false
},
{
name: '售后中',
value: 11,
checked: false
},
{
name: '已售后',
value: 12,
checked: false
}
]
}
},
onReachBottom() {
if (this.searchForm.pageNum >= this.totalPages) return;
// this.status = 'loading';
this.searchForm.pageNum++;
this.getOrderList();
},
filters:{
formatISOTime(isoString) {
const date = new Date(isoString);
const year = date.getFullYear();
const month = (date.getMonth() + 1).toString().padStart(2, '0');
const day = date.getDate().toString().padStart(2, '0');
const hours = date.getHours().toString().padStart(2, '0');
const minutes = date.getMinutes().toString().padStart(2, '0');
const seconds = date.getSeconds().toString().padStart(2, '0');
return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
}
},
onShow() {
this.menuButtonInfo = uni.getMenuButtonBoundingClientRect()
},
onLoad(option) {
if(option.index){
this.searchForm.searchStatus = option.index
this.currentIndex = option.index
}
this.getList()
},
methods: {
getList(){
this.loadStatus = 'loading'
let that = this
that.tui.request("/mall/order/page", "POST", this.searchForm, false, false).then((res) => {
that.loadStatus = 'nomore';
if (res.code == 200) {
if (that.searchForm.pageNum == 1) {
that.orderList = res.result.records;
} else {
that.orderList = [...that.orderList, ...res.result.records]
}
for(let i=0;i<that.orderList.length;i++){
that.orderList[i].goodsNum = 0
for(let m=0;m<that.orderList[i].goodsList.length;m++){
that.orderList[i].goodsNum += that.orderList[i].goodsList[m].quantity
}
}
that.totalPages = res.result.pages; // pages =
that.$forceUpdate();
} else {
that.tui.toast(res.message);
return;
}
uni.hideLoading();
}).catch((res) => {});
},
goDetail(id){
uni.navigateTo({
url:'/package2/shop/orderDetail?id=' + id
})
},
handleStatusClick(index,value) {
if (this.currentIndex === index) return;
this.currentIndex = index;
this.searchForm.searchStatus = value
this.getList()
},
back() {
uni.navigateBack()
},
}
}
</script>
<style>
page {
width: 100%;
height: 100%;
font-size: 24rpx;
background: #F5F8F5;
color: #00231C;
}
.page1 {
width: 100%;
height: 100%;
font-size: 24rpx;
position: relative;
}
.title {
background: url('https://jewel-shop.oss-cn-beijing.aliyuncs.com/8bc15960c2dc40268e295d6dd23aecce.png') no-repeat;
width: 100%;
height: 20%;
}
.title-sreach {
width: 100%;
display: flex;
height: 200rpx;
position: relative;
}
.back-btn {
position: absolute;
bottom: 0;
left: 0;
}
.title-name {
padding-top: 110rpx;
font-size: 36rpx;
font-weight: 700;
flex: 1;
text-align: center;
}
.title-tab {
display: flex;
margin: -120rpx auto 0;
}
.status-scroll-view {
width: 100%;
white-space: nowrap;
/* 辅助滚动,与 flex 配合确保不换行 */
height: auto;
}
.status-list {
display: flex;
flex-direction: row;
flex-wrap: nowrap;
align-items: center;
padding: 0 0;
/* 可根据设计添加左右留白,但会影响“一排5个”精准计算,故留白为0 */
min-height: 88rpx;
/* 保证内部项撑开高度 */
}
/* 每个状态项:宽度为屏幕宽度的1/5,保证一行正好显示5个,超出滚动 */
.status-item {
flex-shrink: 0;
width: 20vw;
/* 关键:屏幕宽度的1/5,正好一排5个 */
text-align: center;
padding: 20rpx 0;
position: relative;
box-sizing: border-box;
transition: all 0.2s cubic-bezier(0.25, 0.46, 0.45, 0.94);
/* 点击反馈 */
-webkit-tap-highlight-color: transparent;
}
.status-text {
font-size: 28rpx;
color: #666666;
font-weight: normal;
line-height: 1.4;
transition: color 0.2s, font-weight 0.2s;
}
/* 激活状态样式 */
.status-item.active .status-text {
color: #ff6b35;
font-weight: 500;
}
/* 激活指示条(下划线) */
.status-item.active::after {
content: '';
position: absolute;
bottom: 0;
left: 50%;
transform: translateX(-50%);
width: 40rpx;
height: 4rpx;
background-color: #ff6b35;
border-radius: 2rpx;
transition: width 0.2s ease;
}
.box1 {
width: 95%;
margin: 20rpx auto;
background: #fff;
border-radius: 20rpx;
padding: 20rpx;
}
</style>

154
pages/shop/shopSettlementDetail.vue

@ -0,0 +1,154 @@
<template>
<!-- 商家订单详情 -->
<view class="page1">
<view class="title">
<view class="title-sreach">
<view class="back-btn" @tap="back">
<uni-icons type="left" size="28"></uni-icons>
</view>
<view class="title-name">
账单详情
</view>
</view>
</view>
<view class="content">
<view class="box1">
<view style="font-size: 14px;font-weight: 700;margin-bottom: 10px;">
2026-04-09
</view>
<view style="display: flex;font-weight: 700;">
<view style="flex: 1;">
结算金额100.00
</view>
<view style="flex: 1;">
实际打款金额100.00
</view>
</view>
</view>
<view class="box1">
<uni-table border stripe emptyText="暂无更多数据" >
<!-- 表头行 -->
<uni-tr>
<uni-th width="100" align="center">订单编号</uni-th>
<uni-th width="100" align="center">商品金额</uni-th>
<uni-th width="100" align="center">餐盒费</uni-th>
<uni-th width="100" align="center">平台抽佣</uni-th>
<uni-th width="100" align="center">结算金额</uni-th>
</uni-tr>
<!-- 表格数据行 -->
<uni-tr>
<uni-td align="center">5154564164654</uni-td>
<uni-td align="center">24</uni-td>
<uni-td align="center">1</uni-td>
<uni-td align="center">1</uni-td>
<uni-td align="center">22</uni-td>
</uni-tr>
<uni-tr>
<uni-td align="center">5154564164654</uni-td>
<uni-td align="center">24</uni-td>
<uni-td align="center">1</uni-td>
<uni-td align="center">1</uni-td>
<uni-td align="center">22</uni-td>
</uni-tr>
<uni-tr>
<uni-td align="center">5154564164654</uni-td>
<uni-td align="center">24</uni-td>
<uni-td align="center">1</uni-td>
<uni-td align="center">1</uni-td>
<uni-td align="center">22</uni-td>
</uni-tr>
<uni-tr>
<uni-td align="center">5154564164654</uni-td>
<uni-td align="center">24</uni-td>
<uni-td align="center">1</uni-td>
<uni-td align="center">1</uni-td>
<uni-td align="center">22</uni-td>
</uni-tr>
</uni-table>
</view>
</view>
</view>
</template>
<script>
export default {
data() {
return {
}
},
filters:{
formatISOTime(isoString) {
const date = new Date(isoString);
const year = date.getFullYear();
const month = (date.getMonth() + 1).toString().padStart(2, '0');
const day = date.getDate().toString().padStart(2, '0');
const hours = date.getHours().toString().padStart(2, '0');
const minutes = date.getMinutes().toString().padStart(2, '0');
const seconds = date.getSeconds().toString().padStart(2, '0');
return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
}
},
onShow() {
},
onLoad() {
},
methods: {
back() {
uni.navigateBack()
}
}
}
</script>
<style>
page {
width: 100%;
height: 100%;
font-size: 24rpx;
background: #F5F8F5;
color: #00231C;
}
.page1 {
width: 100%;
height: 100%;
font-size: 24rpx;
position: relative;
}
.title {
background: url('https://jewel-shop.oss-cn-beijing.aliyuncs.com/8bc15960c2dc40268e295d6dd23aecce.png') no-repeat;
width: 100%;
height: 20%;
}
.title-sreach {
width: 100%;
display: flex;
height: 200rpx;
position: relative;
}
.back-btn {
padding-top: 110rpx;
}
.title-name {
padding-top: 110rpx;
font-size: 36rpx;
font-weight: 700;
flex: 1;
text-align: center;
}
.content{
margin: -140rpx auto;
}
.box1 {
width: 95%;
margin: 20rpx auto;
background: #fff;
border-radius: 20rpx;
padding: 20rpx;
}
</style>
Loading…
Cancel
Save