解决了已知问题

This commit is contained in:
Ling53666 2025-01-13 21:07:00 +08:00
parent 38fd44dbca
commit f1173e3b68
54 changed files with 3124 additions and 895 deletions

View File

@ -109,6 +109,21 @@
"title": "支付界面",
"page": "pages/zhifujiemian/zhifujiemian",
"launchMode": "common"
},
{
"title": "商品界面",
"page": "pages/shangpinjiemian/shangpinjiemian",
"launchMode": "common"
},
{
"title": "预约支付",
"page": "pages/yuyuezhifu/yuyuezhifu",
"launchMode": "common"
},
{
"title": "pages/shanmenspjm/shanmenspjm",
"page": "pages/shanmenspjm/shanmenspjm",
"launchMode": "common"
}
]
}

View File

@ -23,7 +23,11 @@
"pages/meijiashirenzheng/meijiashirenzheng",
"pages/pingjia/pingjia",
"pages/test1/test1",
"pages/denglutest/denglutest"
"pages/denglutest/denglutest",
"pages/yuyuezhifu/yuyuezhifu",
"pages/shnagmendianpu/shnagmendianpu",
"pages/yuyuezhifusm/yuyuezhifusm",
"pages/yuyuejiemian/yuyuejiemian"
],
"window": {
"defaultTitle": "甲情甲意",

View File

@ -19,7 +19,7 @@
<!-- 店铺界面 -->
<view style="width:100%">
<view class="box2" >
<view class="kuang" a:for="{{ sousuo }}" a:key="{{index}}" data-num="{{item}}" onTap="dianpu">
<view class="kuang" a:for="{{ sousuo }}" a:key="{{index}}" data-num="{{item}}" onTap="dianpu" a:if="{{ item.state==1 }}">
<image class="image" mode="scaleToFill" src="{{item.businessAvatar}}" />
<view class="wenzi">
<text class="text">{{item.businessName}}</text>

View File

@ -1,8 +1,7 @@
.cebian {
width: 20%;
height: 100v;
height: 100vh;
background-color: #efeced;
overflow: hidden;
}
.text {
@ -26,17 +25,20 @@
}
.xinxi{
width: 80%;
height: 100%;
height: 550px;
display: flex;
justify-content: center;
align-items: center;
flex-direction: column;
overflow-y: scroll
overflow-y: scroll;
overflow-x: hidden;
}
.pages{
width: 100%;
height: 560px;
display: flex;
margin-top: 30rpx;
}
.shop{
width: 90%;
@ -73,7 +75,7 @@
background-color: #fb96b1;
}
.yuyuekuang{
width: 100%;
width: 95%;
display: flex;
justify-content: space-between;
}
@ -177,7 +179,8 @@ height: 20px;
.pingjia{
width: 100%;
display: flex;
justify-content: center;
flex-direction: column;
align-items: center;
margin-top: 10rpx;
}
.pingjiakuang{

View File

@ -62,7 +62,7 @@
<image class="image" mode="scaleToFill" src="{{item.commoditiesImage}}" />
</view>
<view style="width:100%">
<view class="dingwei" style="width:120px;height:20px;top: 35rpx;">
<view class="dingwei" style="width:150px;height:20px;top: 35rpx;">
<text>{{item.commoditiesName}}</text>
</view>
<view class="dingwei" style="width:170px;height:40px;top:50rpx">
@ -74,7 +74,7 @@
<text>预约</text>
</view>
</view>
<view class="dingwei" style="left:300rpx;bottom:130rpx" onTap="soucang">
<view class="dingwei" style="width:20px;left:290rpx;bottom:130rpx" onTap="jiaru" data-num="{{item}}">
<image class="gouimage" mode="scaleToFill" src="../image/tijiagouwuche.png" />
</view>
</view>
@ -83,15 +83,15 @@
</view>
<!-- 评价 -->
<view class="pingjia" a:if="{{ showComments }}">
<view class="pingjiakuang">
<view class="pingjiakuang" a:for="{{ pingjia }}">
<view class="touxiang">
<image class="pingjiaimage" mode="scaleToFill" src="../image/meijia1.jpg" />
<text style="margin-left:10rpx">陌路</text>
<image class="pingjiaimage" mode="scaleToFill" src="{{item.user.avatarUrl}}" />
<text style="margin-left:10rpx">{{item.user.username}}</text>
</view>
<view style="width:100%">
<text style="color:#8a8f93;font-size:13px">颜色冰透系列裸色01色+烤灯-简约</text>
<view style="width:100%;word-wrap: break-word;">
<text>aslkjhdklajshdkalsdhaskljdhaskldhaskhdaksjhdkjsh</text>
<text>{{item.userRating.review}}</text>
</view>
</view>
<view class="tupianbox">

View File

@ -42,6 +42,7 @@ Page({
showShoppingCart: true, // 控制购物车部分是否显示
showComments: false, // 控制评论部分是否显示
showBusinessInfo: false, // 控制商家信息是否显示
pingjia:[],
},
onLoad(options) {
// Extract userId and address from options
@ -54,7 +55,7 @@ Page({
const storeStatus = options.storeStatus;
const id = options.id
const businessPhone = options.businessPhone
console.log(id,'zheyedesaksdas');
console.log(id,'这是店铺id吗');
// Set them in data for use in the page
this.setData({
userId: userId,
@ -72,10 +73,10 @@ Page({
method: 'POST',
data: {
businessId: id,
commoditiesGroupId: id,
commoditiesGroupId: "",
commoditiesName: "",
current: 0,
pageSize: 2,
pageSize: 100,
sortField: "",
sortOrder: "",
status: "",
@ -101,7 +102,7 @@ Page({
console.error('Request failed', error);
}
});
this.pingjia()
},
soucang() {
my.getStorage({
@ -115,7 +116,8 @@ Page({
url: url + '/api/collect/add',
method: 'POST',
data: {
businessId: businessId // 使用 businessId 来请求收藏
businessId: businessId, // 使用 businessId 来请求收藏
userId: userInfo.id
},
headers: {
'content-type': 'application/json',
@ -123,6 +125,7 @@ Page({
},
dataType: 'json',
success: (res) => {
console.log(res);
if(res.data.code===0){
my.alert({
content: '收藏成功'
@ -159,57 +162,37 @@ Page({
},
});
},
// meijiahsi(){
// my.request({
// url: url + '/api/manicurist/userQueryAll',
// method: 'GET',
// data: {
// businessId: this.data.id
// },
// headers: {
// 'content-type': 'application/json',
// },
// dataType: 'json',
// success: (res) => {
// console.log('Request succeeded:', res);
// if (res.data && res.data.data) {
// this.setData({
// meijiashi: res.data.data, // 更新 tuijian 列表
// });
// } else {
// console.log('shibaile')
// }
// },
// fail: (error) => {
// console.error('Request failed', error);
// }
// });
// },
pingjia(){
my.navigateTo({
url:'/pages/shangpinpingjia/shangpinpingjia'
})
my.request({
url: url + '/api/level/listBusinessRating',
method: 'GET',
data: {
businessId:this.data.id,
},
headers: {
'content-type': 'application/json',
},
dataType: 'json',
success: (res) => {
console.log(res,'评价部分');
if(res.data.code===0){
this.setData({
pingjia:res.data.data,
useridpingjia:res.data.data.userId
})
}
},
fail: (error) => {
console.error('请求失败: ', JSON.stringify(error));
my.alert({ content: '请求失败,请稍后重试' });
},
});
},
zixun(){
my.navigateTo({
url:'/pages/zixunmeijiashi/zixunmeijiashi'
})
},
shangpinjiemian(item){
const id = item.target.dataset.num
console.log('传递的数据:', id);
const ids = id.id
const commoditiesPrice = id.commoditiesPrice
const commoditiesName = id.commoditiesName
const commoditiesImage = id.commoditiesImage
const businessId = id.businessId
console.log('Address being passed: ',id,commoditiesPrice,commoditiesName,commoditiesImage,businessId);
my.navigateTo({
url:`/pages/shangpinjiemian/shangpinjiemian?commoditiesPrice=${commoditiesPrice}&&commoditiesName=${commoditiesName}&&commoditiesImage=${commoditiesImage}&&ids=${ids}&&businessId=${businessId}`
})
console.log(ids,businessId,commoditiesImage,commoditiesName,commoditiesPrice+'这是商品的')
},
// 点击事件处理函数
selectItem(e) {
const id = e.currentTarget.dataset.id;
@ -282,4 +265,80 @@ chaxunzhuangtai(e) {
});
}
},
jiaru(item) {
const id = item.target.dataset.num
console.log('传递的数据:', id);
const ids = id.id
const businessId = id.businessId
my.getStorage({
key: 'userInfo',
success: (res) => {
const userInfo = res.data;
console.log(userInfo);
if (userInfo && userInfo.cookie) {
my.request({
url: url + '/api/cart/add',
method: 'POST',
data: {
businessId: businessId,
commoditiesId: ids,
quantity: 1,
selectedOptions: "",
userId: userInfo.id
},
headers: {
'content-type': 'application/json',
'Cookie': userInfo.cookie, // 通过头部传递 cookie
},
dataType: 'json',
success: (res) => {
if(res.data.code===0){
console.log(res);
my.alert({ content: '成功添加到购物车' });
}
else if(res.data.code===40100){
my.alert({
content: '登录信息已过期,请重新登录'
});
my.navigateTo({
url:'/pages/denglu/denglu'
})
}else{
console.log(res,'shibaile');
}
},
fail: (error) => {
console.error('请求失败: ', JSON.stringify(error));
my.alert({ content: '请求失败,请稍后重试' });
},
});
} else {
my.alert({
content: '您未登录,请先登录。',
success: () => {
my.navigateTo({
url: '/pages/denglu/denglu',
});
},
});
}
},
});
},
shangpinjiemian(item){
const id = item.target.dataset.num
console.log('传递的数据:', id);
const ids = id.id
const commoditiesPrice = id.commoditiesPrice
const commoditiesName = id.commoditiesName
const commoditiesImage = id.commoditiesImage
const businessId = id.businessId
const dianpuid = this.data.id
const businessName =this.data.businessName
console.log('Address being passed: ',id,commoditiesPrice,commoditiesName,commoditiesImage,businessId);
my.navigateTo({
url:`/pages/shangpinjiemian/shangpinjiemian?commoditiesPrice=${commoditiesPrice}&&commoditiesName=${commoditiesName}&&commoditiesImage=${commoditiesImage}&&ids=${ids}&&businessId=${businessId}&&dianpuid=${dianpuid}&&businessName=${businessName}`
})
console.log(ids,businessId,commoditiesImage,commoditiesName,commoditiesPrice+'这是商品的',dianpuid+'这是店铺的')
},
});

View File

@ -127,10 +127,10 @@ calculateTotalPrice() {
},
// 页面加载时获取商品数据
onLoad() {
onShow() {
this.setData({
select_all: false,
products:[],
selectedProducts:[],
});
my.getStorage({
key: 'userInfo',
@ -140,13 +140,16 @@ calculateTotalPrice() {
my.request({
url: url + '/api/cart/selectByUserId',
method: 'POST',
data: { id: this.data.id },
data: {
id: userInfo.id
},
headers: {
'content-type': 'application/json',
'Cookie': userInfo.cookie,
},
dataType: 'json',
success: (res) => {
console.log(res,'hhhhhhhhhhhh');
if (res.data.code === 0) {
console.log(res);
const cartItems = res.data.data;
@ -191,14 +194,21 @@ calculateTotalPrice() {
const userInfo = res.data;
this.setData({
id: userInfo.id, // 获取 id
});
// 发送请求移除商品
if (userInfo && userInfo.cookie) {
my.request({
url: url + '/api/cart/delete',
method: 'POST',
data: { id: cartId }, // 使用 cartId 作为参数
headers: { 'content-type': 'application/json', 'Cookie': userInfo.cookie },
data: {
id: cartId,
userId: userInfo.id
}, // 使用 cartId 作为参数
headers: {
'content-type': 'application/json',
'Cookie': userInfo.cookie
},
dataType: 'json',
success: (res) => {
console.log(res);

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 397 B

After

Width:  |  Height:  |  Size: 9.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 478 B

After

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 371 B

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 631 B

After

Width:  |  Height:  |  Size: 3.5 KiB

View File

@ -1,8 +1,6 @@
.container {
padding: 20px;
}
.section-title {
font-size: 18px;
font-weight: bold;
@ -72,19 +70,24 @@
margin-top: 20px;
}
.button {
background-color: #f3bfc1; /* Light pink background color */
color: #000000; /* Text color */
border-radius: 20px; /* Rounded edges */
padding: 10px 20px;
text-align: center;
width: 80%;
height: 40px;
background-color: #f3bfc1;
color: #000000;
border-radius: 20px;
font-size: 16px;
width: 300px;
margin-top: 20px;
cursor: pointer; /* 鼠标悬停时显示为点击样式 */
position: relative;
left: 20px;
display: flex;
justify-content: center;
align-items: center;
}
.box{
position: relative;
right: 13px;
}
.tijiao{
width: 100%;
height: 100px;
display: flex;
justify-content: center;
align-items: center;
}

View File

@ -5,6 +5,10 @@
<text class="label">姓名</text>
<input class="input" placeholder="请输入姓名" onInput="businessName"/>
</view>
<view class="input-row">
<text class="label">性别</text>
<input class="input" placeholder="请输入性别" onInput="xingbie"/>
</view>
<view class="input-row">
<text class="label">电子邮箱</text>
<input class="input" placeholder="请输入电子邮箱" onInput="person" />
@ -23,6 +27,10 @@
<text class="label">身份证号</text>
<input class="input" placeholder="请输入身份证号" onInput="idcard"/>
</view>
<view class="input-row">
<text class="label">擅长项目</text>
<input class="input" placeholder="请输入擅长项目" onInput="shanchang"/>
</view>
<view class="box">
<ant-list-item>
请选择省市
@ -42,24 +50,14 @@
<view class="input-row">
<text class="label">请上传美甲师证明</text>
<ant-uploader
defaultFileList="{{defaultFileList}}"
onChange="onChange"
onUpload="onUpload"
onPreview="onPreview"
onRemove="onRemove"
/>
onUpload="{{onUpload ? onUpload : 'onUpload'}}"
uploadingText="上传中……"
uploadfailedText="上传失败"
></ant-uploader>
</view>
<view class="input-row">
<text class="label">请上传身份证照</text>
<ant-uploader
defaultFileList="{{defaultFileList}}"
onChange="onChange"
onUpload="onUpload"
onPreview="onPreview"
onRemove="onRemove"
/>
</view>
</view>
<view class="button" onTap="ruzhu">提交申请</view>
</view>
<view class="tijiao">
<view class="button" onTap="ruzhu">提交申请</view>
</view>

View File

@ -29,14 +29,15 @@ Page({
url: url + '/api/manicurist/add',
method: 'POST',
data: {
certificate_path: this.data.selectedOption,
certificate_path: this.data.zhengshu,
certification_number: this.data.idcard,
email: this.data.person,
gender: 0,
issuing_authority: "hhh",
gender: this.data.xingbie,
issuing_authority: this.data.selectedOption,
manicuristName: this.data.businessName,
phone: this.data.phone,
specialties: "hhh"
specialties: this.data.shanchang,
userId: userInfo.id
},
headers: {
'content-type': 'application/json',
@ -44,17 +45,18 @@ Page({
},
dataType: 'json',
success: (res) => {
console.log(res);
if(res.data.code===0){
my.navigateBack();
my.alert({content:res.data.description})
my.alert({content:'审核中请耐心等待'})
}
elif(res.data.code===50001)
{
my.alert({content:res.data.description})
my.alert({content:'姓名已存在或参数有误'})
}
elif(res.data.code===40100)
{
my.alert({content:res.data.description})
my.alert({content:'请先登录'})
}
},
fail: (error) => {
@ -82,6 +84,18 @@ Page({
});
console.log(e.detail.value);
},
shanchang(e) {
this.setData({
shanchang: e.detail.value,
});
console.log(e.detail.value);
},
xingbie(e) {
this.setData({
xingbie: e.detail.value,
});
console.log(e.detail.value);
},
person(e) {
this.setData({
person: e.detail.value,
@ -174,7 +188,59 @@ validateForm() {
});
return false;
}
if (!this.data.zhengshu) {
my.showToast({
content: '请选择省市',
type: 'none',
duration: 2000,
});
return false;
}
if (!this.data.shanchang) {
my.showToast({
content: '请选择省市',
type: 'none',
duration: 2000,
});
return false;
}
if (!this.data.xingbie) {
my.showToast({
content: '请选择省市',
type: 'none',
duration: 2000,
});
return false;
}
return true; // 所有验证通过
},
// 证明
onUpload(file) {
return new Promise((resolve, reject) => {
console.log('上传文件路径:', file); // 确保文件路径正确
my.uploadFile({
url: url + '/api/file/upload/server/not_login',
fileType: 'image',
name: 'file',
filePath: file.path,
formData: {
biz: 'card',
},
success: res => {
resolve(file.path);
console.log('上传成功:', res);
const cunchu = JSON.parse(res.data)
this.setData({
zhengshu:cunchu.data,
})
console.log(this.data.yingyeimage,'hhhhhhhhhhhhhhh');
},
fail: (err) => {
console.log('上传失败:', err);
reject();
},
});
});
},
});

View File

@ -72,19 +72,24 @@
margin-top: 20px;
}
.button {
background-color: #f3bfc1; /* Light pink background color */
color: #000000; /* Text color */
border-radius: 20px; /* Rounded edges */
padding: 10px 20px;
text-align: center;
width: 80%;
height: 40px;
background-color: #f3bfc1;
color: #000000;
border-radius: 20px;
font-size: 16px;
width: 300px;
margin-top: 20px;
cursor: pointer; /* 鼠标悬停时显示为点击样式 */
position: relative;
left: 20px;
display: flex;
justify-content: center;
align-items: center;
}
.box{
position: relative;
right: 13px;
}
.tijiao{
width: 100%;
height: 100px;
display: flex;
justify-content: center;
align-items: center;
}

View File

@ -11,17 +11,22 @@
<icon type="eye" />
</view>
</view>
<view class="section">
<view class="input-row">
<text class="label">联系方式</text>
<input class="input" placeholder="请输入联系人电话" onInput="phone"/>
</view>
<view class="input-row">
<!-- <view class="input-row">
<text class="label">身份证号</text>
<input class="input" placeholder="请输入身份证号" onInput="idcard"/>
</view> -->
<view class="input-row">
<text class="label">账号</text>
<input class="input" placeholder="请输入账号" onInput="userAccount"/>
</view>
<view class="input-row">
<text class="label">密码</text>
<input class="input" placeholder="请输入密码" onInput="userPassword"/>
</view>
<view class="box">
<ant-list-item>
@ -41,24 +46,32 @@
<view class="input-row">
<text class="label">请上传营业执照</text>
<ant-uploader
defaultFileList="{{defaultFileList}}"
onChange="onChange"
onUpload="onUpload"
onPreview="onPreview"
onRemove="onRemove"
/>
onUpload="{{onUpload ? onUpload : 'onUpload'}}"
uploadingText="上传中……"
uploadfailedText="上传失败"
></ant-uploader>
</view>
<view class="input-row">
<text class="label">请上传身份证照</text>
<text class="label">请上传身份证正面照</text>
<ant-uploader
defaultFileList="{{defaultFileList}}"
onChange="onChange"
onUpload="onUpload"
onPreview="onPreview"
onRemove="onRemove"
/>
onChange="onChange"
onUpload="{{onUpload1 ? onUpload1 : 'onUpload1'}}"
uploadingText="上传中……"
uploadfailedText="上传失败"
></ant-uploader>
</view>
<view class="input-row">
<text class="label">请上传身份证反面照</text>
<ant-uploader
onChange="onChange"
onUpload="{{onUpload2 ? onUpload2 : 'onUpload2'}}"
uploadingText="上传中……"
uploadfailedText="上传失败"
></ant-uploader>
</view>
<view class="button" onTap="ruzhu">提交申请</view>
</view>
</view>
<view class="tijiao">
<view class="button" onTap="ruzhu">提交申请</view>
</view>

View File

@ -1,4 +1,5 @@
import cityList from './city';
import {url} from '../request'
Page({
data: {
cityList,
@ -7,30 +8,38 @@ Page({
},
onLoad() {},
ruzhu(){
// my.request({
// url: url+'/api/business/add',
// method: 'POST',
// data: {
// },
// headers: {
// 'content-type': 'application/json', //默认值
// },
// dataType: 'json',
// success: (res)=> {
// my.alert({ content: 'success' });
// },
// fail: function (error) {
// console.error('fail: ', JSON.stringify(error));
// },
// complete: function (res) {
// my.hideLoading();
// my.alert({ content: 'complete' });
// },
// });
my.alert({ content: '正在审核中,请耐心等待' });
my.navigateBack()
if (!this.validateForm()) {
return; // 验证未通过,阻止提交
}
my.request({
url: url+'/api/business/add',
method: 'POST',
data: {
address: this.data.selectedOption,
backIdCard: this.data.backIdCard,
businessName: this.data.businessName,
businessPhone: this.data.phone,
frontIdCard:this.data.frontIdCard,
license: this.data.yingyeimage,
shopkeeper: this.data.person,
userAccount: this.data.userAccount,
userPassword: this.data.userPassword
},
headers: {
'content-type': 'application/json', //默认值
},
dataType: 'json',
success: (res)=> {
console.log(res);
my.alert({ content: '正在审核中,请耐心等待' });
my.navigateBack()
},
fail: function (error) {
console.error('fail: ', JSON.stringify(error));
},
});
},
// 获取数据
businessName(e) {
this.setData({
businessName: e.detail.value,
@ -49,10 +58,220 @@ Page({
});
console.log(e.detail.value);
},
idcard(e) {
// idcard(e) {
// this.setData({
// idcard: e.detail.value,
// });
// console.log(e.detail.value);
// },
userAccount(e) {
this.setData({
idcard: e.detail.value,
userAccount: e.detail.value,
});
console.log(e.detail.value);
},
userPassword(e) {
this.setData({
userPassword: e.detail.value,
});
console.log(e.detail.value);
},
// 地点选择
handleCascaderPickerChange(cascaderValue, selectedOption, e) {
console.log('cityChange', cascaderValue, selectedOption, e);
},
handleCascaderOnOk(cascaderValue, selectedOption, e) {
console.log('cityOk', cascaderValue, selectedOption, e);
const selectedCityLabels = selectedOption.map(option => option.label).join(' ');
this.setData({
selectedOption: selectedCityLabels
});
console.log('Selected cities:', this.data.selectedOption);
},
// 前端校验
validateForm() {
// 验证店铺名(非空)
if (!this.data.businessName) {
my.showToast({
content: '店铺名不能为空',
type: 'none',
duration: 2000,
});
return false;
}
if (!this.data.userPassword&&this.data.userPassword.length>=8) {
my.showToast({
content: '密码不能为空并且不少于8位',
type: 'none',
duration: 2000,
});
return false;
}
if (!this.data.userAccount) {
my.showToast({
content: '账号不能为空',
type: 'none',
duration: 2000,
});
return false;
}
if (!this.data.person) {
my.showToast({
content: '姓名不能为空',
type: 'none',
duration: 2000,
});
return false;
}
// 验证电话(简单的正则校验)
const phoneRegex = /^1[3-9]\d{9}$/;
if (!this.data.phone || !phoneRegex.test(this.data.phone)) {
my.showToast({
content: '请输入有效的手机号码',
type: 'none',
duration: 2000,
});
return false;
}
// 验证身份证号(简单的正则校验)
// const idcardRegex = /^\d{17}(\d|X)$/;
// if (!this.data.idcard || !idcardRegex.test(this.data.idcard)) {
// my.showToast({
// content: '请输入有效的身份证号',
// type: 'none',
// duration: 2000,
// });
// return false;
// }
// 验证是否选择了城市
if (!this.data.selectedOption) {
my.showToast({
content: '请选择省市',
type: 'none',
duration: 2000,
});
return false;
}
// 验证图片是否上传
if (!this.data.yingyeimage) {
my.showToast({
content: '请上传营业执照',
type: 'none',
duration: 2000,
});
return false;
}
if (!this.data.frontIdCard) {
my.showToast({
content: '请上传身份证正面照',
type: 'none',
duration: 2000,
});
return false;
}
if (!this.data.backIdCard) {
my.showToast({
content: '请上传身份证反面照',
type: 'none',
duration: 2000,
});
return false;
}
return true; // 所有验证通过
},
onChange(fileList) {
console.log('图片列表:', fileList);
},
// 营业执照
onUpload(file) {
return new Promise((resolve, reject) => {
console.log('上传文件路径:', file); // 确保文件路径正确
my.uploadFile({
url: url + '/api/file/upload/server/not_login',
fileType: 'image',
name: 'file',
filePath: file.path,
formData: {
biz: 'card',
},
success: res => {
resolve(file.path);
console.log('上传成功:', res);
const cunchu = JSON.parse(res.data)
this.setData({
yingyeimage:cunchu.data,
})
console.log(this.data.yingyeimage,'hhhhhhhhhhhhhhh');
},
fail: (err) => {
console.log('上传失败:', err);
reject();
},
});
});
},
// 身份证正面
onUpload1(file) {
return new Promise((resolve, reject) => {
console.log('上传文件路径:', file); // 确保文件路径正确
my.uploadFile({
url: url + '/api/file/upload/server/not_login',
fileType: 'image',
name: 'file',
filePath: file.path,
formData: {
biz: 'card',
},
success: res => {
resolve(file.path);
console.log('上传成功:', res);
const cunchu = JSON.parse(res.data)
this.setData({
frontIdCard:cunchu.data,
})
console.log(this.data.yingyeimage,'hhhhhhhhhhhhhhh');
},
fail: (err) => {
console.log('上传失败:', err);
reject();
},
});
});
},
// 身份证反面
onUpload2(file) {
return new Promise((resolve, reject) => {
console.log('上传文件路径:', file); // 确保文件路径正确
my.uploadFile({
url: url + '/api/file/upload/server/not_login',
fileType: 'image',
name: 'file',
filePath: file.path,
formData: {
biz: 'card',
},
success: res => {
resolve(file.path);
console.log('上传成功:', res);
const cunchu = JSON.parse(res.data)
this.setData({
backIdCard:cunchu.data,
})
console.log(this.data.yingyeimage,'hhhhhhhhhhhhhhh');
},
fail: (err) => {
console.log('上传失败:', err);
reject();
},
});
});
},
});

View File

@ -1,12 +1,13 @@
.search-line {
width: 100%;
display: flex;
align-items: center;
justify-content: center;
padding: 16px;
justify-content: space-between;
padding: 10px;
}
.cancel {
margin-left: 8px;
color: var(--color-text-primary);
}
.image1{
width: 30rpx;
@ -88,4 +89,14 @@
align-items: center;
margin-top: 50rpx;
flex-direction: column;
}
.dingweikuang{
width: 100%;
position: relative;
left: 50rpx;
top: 30rpx;
}
.dingweiimage{
width: 30rpx;
height: 30rpx;
}

View File

@ -1,36 +1,25 @@
<view>
<view style="width:100%;margin-top:20rpx">
<view class="box1">
<!-- 搜索框 -->
<view class="box">
<view class="search-line">
<ant-input
placeholder="请输入内容"
onChange="onChange"
className="search-bar"
focusClassName="search-bar-focus"
confirmType="search"
allowClear
focus
onConfirm="onConfirm"
>
<ant-icon
slot="prefix"
type="SearchOutline"
></ant-icon>
<ant-icon
slot="suffix"
type="AudioOutline"
></ant-icon>
</ant-input>
<view class="cancel">
<image mode="scaleToFill" class="image1" src="../image/dingwei.png" />
<text style="margin-left:8rpx">{{selectedCity}}</text>
<view style="display:flex;align-items:center">
<image style="width:20px;height:20px" mode="scaleToFill" src="../image/sousuo.png" />
<input onInput="onChange" onConfirm="onConfirm" style="margin-left:10rpx;width:230px" placeholder="请输入内容" />
</view>
<view class="cancel">取消</view>
</view>
</view>
</view>
<!-- 定位 -->
<view class="dingweikuang">
<image mode="scaleToFill" class="dingweiimage" src="../image/dingwei.png" />
<text style="margin-left:8rpx">{{selectedCity}}</text>
</view>
<!-- 店铺界面 -->
<view style="width:100%">
<view class="box2" >
<view class="kuang" a:for="{{ xuanran }}" a:key="{{index}}" data-num="{{item}}" onTap="dianpu">
<view class="kuang" a:for="{{ xuanran }}" a:key="{{index}}" data-num="{{item}}" a:if="{{ item.state==1 }}" onTap="dianpu">
<image class="image" mode="scaleToFill" src="{{item.businessAvatar}}" />
<view class="wenzi">
<text class="text">{{item.businessName}}</text>

View File

@ -106,13 +106,16 @@ Page({
console.log('Address being passed: ', ID,address,businessName,businessAvatar,endBusiness,startBusiness,businessPhone);
my.navigateTo({
url: `/pages/dianpuzhuye/dianpuzhuye?userId=${userId}&&address=${address}&&businessName=${businessName}&&businessAvatar=${businessAvatar}&&startBusiness=${startBusiness}&&endBusiness=${endBusiness}&&storeStatus=${storeStatus}&&id=${ID}&&businessPhone=${businessPhone}`,
url: `/pages/shnagmendianpu/shnagmendianpu?userId=${userId}&&address=${address}&&businessName=${businessName}&&businessAvatar=${businessAvatar}&&startBusiness=${startBusiness}&&endBusiness=${endBusiness}&&storeStatus=${storeStatus}&&id=${ID}&&businessPhone=${businessPhone}`,
});
},
onChange(value) {
onChange(e) {
this.setData({
inputtext:value
})
inputtext:e.detail.value,
});
console.log(e.detail.value);
console.log(this.data.inputtext);
},
});

View File

@ -6,10 +6,9 @@
/* 价格 */
.box1{
width: 100%;
height: 80px;
display: flex;
background-color: #eec2c7;
position: relative;
top:0rpx;
border-radius: 15px;
}
.z1{
@ -18,45 +17,33 @@
position: relative;
}
.z2{
top: 80rpx;
right: 140rpx;
position: relative;
font-weight: bolder;
font-size: 20px;
}
/* 商品底部 */
/* 商品价格 */
.z3{
font-size: 22px;
font-weight: bolder;
position: relative;
top:25rpx;
right: 60rpx;
}
.z4{
position: relative;
color: rgb(29, 18, 18);
}
.box8{
width: 400rpx;
position: relative;
left: 240rpx;
top: 25rpx;
display:flex;
flex-direction: column;
width: 60%;
}
/* 商品介绍 */
.z5{
font-size: 15px;
position: relative;
top:20rpx;
color: darkgrey;
left: 5px;
}
.time{
width: 100%;
height: 400px;
height: auto;
border-top: 2px solid #aba8a8;
margin-top: 40rpx;
margin-bottom: 130rpx;
border-radius: 20px;
}
.yuyuetext{
@ -81,4 +68,56 @@ top: 25rpx;
flex-wrap: wrap;
justify-content: space-evenly;
gap: 10px;
}
.miajishikuang {
display: flex;
flex-wrap: wrap; /* 允许换行 */
justify-content: flex-start; /* 使项目均匀分布 */
gap: 10px;
}
.meijishsibox {
width: 23%;
text-align: center;
}
.meijiashiimage {
width: 70px;
height: 70px;
border-radius: 50%;
display: block;
margin: 0 auto;
}
.mejiashitext {
margin-top: 5px;
display: flex;
justify-content: center;
}
.duihaoimage {
width: 20px;
height: 20px;
}
.duihaoimage{
width: 20px;
height: 20px;
}
.zhifubox{
width: 100%;
display: flex;
justify-content: center;
align-items: center;
position:fixed;
bottom: 40rpx;
}
.zhifuzhong{
width: 90%;
height: 50px;
background-color: #eec2c7;
border-radius: 30px;
display: flex;
justify-content: center;
align-items: center;
}
.textbox{
width: 30%;
display: flex;
flex-direction: column;
}

View File

@ -1,20 +1,22 @@
<view style="display:flex;justify-content:center">
<view>
<!-- 商品图 -->
<view class="Box1">
<image class="image" mode="scaleToFill" src="{{commoditiesImage}}" />
<!-- 价格表 -->
<view class="box1">
<text class="z1">年售1000+</text>
<text class="z2">¥{{commoditiesPrice}}</text>
<text class="z3">【{{commoditiesName}}】</text>
<view class="textbox">
<text class="z1">年售1000+</text>
<view style="margin-top:30rpx">
<text class="z2">¥{{commoditiesPrice}}</text>
</view>
</view>
<view class="box8">
<text class="z3">【{{commoditiesName}}】</text>
<text class="z4">款式随便做,饰品不限量,含甲片,含卸甲</text>
</view>
</view>
<view style="width:100%">
<view style="width:100%;display:flex;align-content:center;justify-content:center;margin-top:20rpx">
<text class="z5">须知 需提前两小时预约 周一至周日全天可用 购买后30天内有效 购买前请仔细阅读</text>
</view>
</view>
</view>
<view class="time">
<view class="yuyuetext">
@ -26,4 +28,23 @@
<text>{{item.title}}</text>
</view>
</view>
<view style="width:100%;height:40px">
<text style="font-weight:bolder;font-size:18px;position:relative;left:30rpx;top:20rpx">指定美甲师</text>
</view>
<view class="miajishikuang">
<view class="meijishsibox" a:for="{{ meijiashi }}" data-index="{{index}}" onTap="onManicuristClick" >
<image class="meijiashiimage" mode="scaleToFill" src="{{item.manicuristAvatar}}" />
<view class="mejiashitext">
<text>{{item.manicuristName}}</text>
</view>
<view style="margin-top:10rpx">
<image a:if="{{item.selected}}" class="duihaoimage" mode="scaleToFill" src="../image/duihao.png" />
</view>
</view>
</view>
</view>
<view class="zhifubox" onTap="zhifu">
<view class="zhifuzhong">
<text style="font-size:18px">立即购买</text>
</view>
</view>

View File

@ -19,6 +19,7 @@ Page({
{ title: '17:00' },
],
selectedTime: '',
meijiashi:[],
},
onLoad(options) {
@ -27,6 +28,9 @@ Page({
const commoditiesPrice = options.commoditiesPrice;
const ids = options.ids;
const businessId = options.businessId;
const dianpuid = options.dianpuid
const businessName = options.businessName
this.setData({
commoditiesImage: commoditiesImage,
@ -34,6 +38,8 @@ Page({
commoditiesPrice: commoditiesPrice,
ids: ids,
businessId: businessId,
dianpuid:dianpuid,
businessName:businessName
});
},
@ -50,26 +56,8 @@ Page({
});
},
onShow(){
this.checkUserLogin
this.meijiahsi()
},
// 检查登录状态
checkUserLogin() {
my.getStorages({
key: 'userInfo',
success: (res) => {
if (res.data && res.data.openId) {
} else {
}
},
fail: (err) => {
console.error('获取用户信息失败:', err);
},
});
},
jiaru() {
my.getStorage({
key: 'userInfo',
@ -130,4 +118,80 @@ this.checkUserLogin
});
console.log('选中的时间:', this.data.selectedTime); // 打印选中的时间
},
// 美甲师
meijiahsi(){
my.request({
url: url + '/api/manicurist/userQueryAll',
method: 'GET',
data: {
businessId: this.data.dianpuid
},
headers: {
'content-type': 'application/json',
},
dataType: 'json',
success: (res) => {
console.log('Request succeeded:', res);
if (res.data && res.data.data) {
const modifiedData = res.data.data.map(item => {
return {
...item, // 保留原来的属性
selected: false // 添加 selected 属性
};
});
// 更新 data 中的 meijiashi 数据
this.setData({
meijiashi: modifiedData
});
console.log(this.data.meijiashi, '更新后数据');
} else {
console.log('shibaile')
}
},
fail: (error) => {
console.error('Request failed', error);
}
});
},
onManicuristClick(event) {
const index = event.currentTarget.dataset.index;
let meijiashi = this.data.meijiashi;
// 取消所有美甲师的选中状态
meijiashi.forEach((item, i) => {
item.selected = false;
});
// 设置当前点击的美甲师为选中状态
meijiashi[index].selected = true;
// 更新 data 中的 meijiashi
this.setData({
meijiashi: meijiashi
});
this.setData({
meijiashiname:meijiashi[index].manicuristName,
meijiashiid:meijiashi[index].id
})
console.log('当前选中的美甲师:', this.data.meijiashiname,this.data.meijiashiid);
},
zhifu(){
const commoditiesImage = this.data.commoditiesImage;
const commoditiesName = this.data.commoditiesName;
const commoditiesPrice = this.data.commoditiesPrice;
const meijiashiname = this.data.meijiashiname;
const yuyuetime = this.data.selectedTime
const meijiashiid = this.data.meijiashiid
const selectedTime = this.data.selectedTime
const dianpuid = this.data.dianpuid
const businessName = this.data.businessName
const shopid = this.data.ids
my.navigateTo({
url:`/pages/yuyuezhifu/yuyuezhifu?commoditiesImage=${commoditiesImage}&&commoditiesName=${commoditiesName}&&commoditiesPrice=${commoditiesPrice}&&meijiashiname=${meijiashiname}&&yuyuetime=${yuyuetime}&&meijiashiid=${meijiashiid}&&selectedTime=${selectedTime}&&dianpuid=${dianpuid}&&businessName=${businessName}&&shopid=${shopid}`
})
console.log(businessName,'dianpumingcheng');
}
});

View File

@ -1,8 +1,7 @@
{
"defaultTitle": "商品界面",
"usingComponents": {
"ant-range-picker": "antd-mini/es/DatePicker/RangePicker/index",
"ant-tabs": "antd-mini/es/Tabs/index"
},
"styleIsolation": "apply-shared"
}

View File

@ -0,0 +1,222 @@
.cebian {
width: 20%;
height: 100%vw;
background-color: #efeced;
}
.text {
width: 100%;
height: 50px;
display: flex;
justify-content: center;
align-items: center;
flex-direction: column;
cursor: pointer;
}
.color {
font-size: 14px;
color: rgb(0, 0, 0); /* 默认文字颜色 */
}
.xian{
width: 60px;
height: 3px;
background-color: #f2819f;
margin-top: 5rpx;
}
.xinxi{
width: 80%;
height: 540px;
display: flex;
align-items: center;
flex-direction: column;
overflow-y: scroll;
overflow-x: hidden;
}
.pages{
width: 100%;
display: flex;
margin-top: 30rpx;
}
.shop{
width: 90%;
height:130px;
border: 1px solid #f2819f;
border-radius: 20px;
margin-top: 20rpx;
display: flex;
}
.image{
width: 100px;
height: 100px;
border-radius: 20px;
}
.imagebox{
width: 100px;
height: 130px;
display: flex;
align-items: center;
justify-content: center;
margin-left: 10rpx;
}
.dingwei{
position: relative;
}
.yuyue{
display: flex;
justify-content: center;
align-items: center;
width: 50px;
height: 20px;
border-radius: 20px;
border: 1px solid #fb96b1;
background-color: #fb96b1;
}
.yuyuekuang{
width: 95%;
display: flex;
justify-content: space-between;
}
.gouimage{
width: 20px;
height: 20px;
}
/* 店铺名框 */
.Box2
{
width: 100%;
height: 150px;
background-color: white;
position: relative;
top:30px;
border-radius: 15px;
}
/* 店铺名 */
.z2{
font-size: 25px;
font-weight: bolder;
position: relative;
}
.image1{
width: 80px;
height: 20px;
margin-left: 10rpx;
margin-top: 20rpx;
}
.z3{
position: relative;
left: 30rpx;
bottom: 8rpx;
color: rgb(194, 53, 53);
}
.z4{
position: relative;
left: 80rpx;
bottom:10rpx;
}
/* 营业时间 */
.z6{
color: #4095E5;
font-weight: bolder;
top:20px;
left: 10px;
position: relative;
}
.z7{
position: relative;
top:38rpx;
left: 30rpx;
font-size: 13px;
}
.box3{
width: 100%;
height: 1px;
background-color: darkgrey;
}
/* 地址 */
.z8{
font-size: 12px;
margin-left: 10rpx;
}
.image3{
width: 10px;
height: 12px;
margin-left: 5rpx;
}
.box4{
width: 100%;
height: 1px;
background-color: darkgrey;
margin-top: 10rpx;
}
.shangimage{
width: 200rpx;
height: 200rpx;
border-radius: 10%;
margin-left: 20rpx;
}
.box8{
width: 500rpx;
height: 200rpx;
position: relative;
left: 230rpx;
bottom: 200rpx;
}
.tiao{
width: 100px;
display: flex;
justify-content: center;
align-items: center;
flex-direction: column;
}
.tiaobox{
width: 100%;
height: 30px;
display: flex;
}
.pingjia{
width: 100%;
display: flex;
justify-content: center;
margin-top: 10rpx;
}
.pingjiakuang{
width: 90%;
border-top: #6e7071 1px solid;
height: auto;
}
.pingjiaimage{
width: 40px;
height: 40px;
border-radius: 50px;
}
.touxiang{
width: 100%;
height: 40px;
display: flex;
align-items: center;
margin-top: 10rpx;
}
.kuangimage{
width: 100px;
height: 100px;
margin:10rpx 10rpx 10rpx 10rpx;
border-radius: 10px;
}
.tupianbox{
width: 100%;
justify-content: center;
}
.soucangimage{
width: 30px;
height: 30px;
position: absolute;
right: 80rpx;
top: -40rpx;
}
.zixunimage{
width: 30px;
height: 30px;
position: absolute;
right: 0rpx;
top: -40rpx;
}

View File

@ -0,0 +1,124 @@
<!-- 店铺名框 -->
<view class="Box2" >
<image class="shangimage" mode="scaleToFill" src="{{businessAvatar}}" />
<view class="box8">
<text class="z2">{{businessName}}</text>
<view style="margin-top:10rpx">
<image mode="scaleToFill" class="image1" src="../image/xingji.png" />
<text class="z3">4.9</text>
<text class="z4">500条</text>
</view>
<view onTap="soucang">
<image class="soucangimage" mode="scaleToFill" src="../image/shoucang.png" />
</view>
<view>
<image class="zixunimage" mode="scaleToFill" src="../image/zixun.png" />
</view>
</view>
</view>
<!-- 营业时间 -->
<view style="width:100%;height:90px">
<view style="height:50px">
<text class="z6" a:if="{{storeStatus === '0'}}">已休息</text>
<text class="z6" a:if="{{storeStatus === '1'}}">营业中</text>
<text class="z7">营业时间:{{startBusiness}}-{{endBusiness}}</text>
</view>
<view>
<view class="box3"></view>
</view>
<!-- 地址 -->
<view style="width:100%;height:50px">
<image class="image3" mode="scaleToFill" src="../image/didian.png" />
<text class="z8">{{address}}</text>
<view>
<view class="box4"></view>
</view>
</view>
</view>
<view class="tiaobox">
<view class="tiao" a:for="{{ names }}" onTap="chaxunzhuangtai" data-id={{item.id}}>
<text>{{item.hengname}}</text>
<view class="xian" a:if="{{item.line}}" ></view>
</view>
</view>
<!-- 购物车 -->
<view class="pages" a:if="{{ showShoppingCart }}">
<!-- 侧边栏 -->
<view class="cebian">
<view class="text"
a:for="{{ lie }}"
onTap="selectItem"
data-id="{{item.id}}">
<text class="color">{{item.name}}</text>
<view>
<!-- 动态绑定 xian 是否显示 -->
<view class="xian" a:if="{{item.showLine}}"></view>
</view>
</view>
</view>
<view class="xinxi">
<view class="shop" a:for="{{ filteredShopping }}">
<view class="imagebox">
<image class="image" mode="scaleToFill" src="{{item.commoditiesImage}}" />
</view>
<view style="width:100%">
<view class="dingwei" style="width:120px;height:20px;top: 35rpx;">
<text>{{item.commoditiesName}}</text>
</view>
<view class="dingwei" style="width:170px;height:40px;top:50rpx">
<text style="font-size:12px;color:#9c9a9a">款式随便做,饰品不限量,含甲片,含卸甲</text>
</view>
<view class="yuyuekuang dingwei" style="top:30px">
<text>¥{{item.commoditiesPrice}}</text>
<view class="yuyue" data-num="{{item}}" onTap="shangpinjiemian">
<text>预约</text>
</view>
</view>
<view class="dingwei" style="width:20px;left:290rpx;bottom:130rpx" onTap="jiaru" data-num="{{item}}">
<image class="gouimage" mode="scaleToFill" src="../image/tijiagouwuche.png" />
</view>
</view>
</view>
</view>
</view>
<!-- 评价 -->
<view class="pingjia" a:if="{{ showComments }}">
<view class="pingjiakuang" a:for="{{ pingjia }}">
<view class="touxiang">
<image class="pingjiaimage" mode="scaleToFill" src="{{item.user.avatarUrl}}" />
<text style="margin-left:10rpx">{{item.user.username}}</text>
</view>
<view style="width:100%">
<text style="color:#8a8f93;font-size:13px">颜色冰透系列裸色01色+烤灯-简约</text>
<view style="width:100%;word-wrap: break-word;">
<text>{{item.userRating.review}}</text>
</view>
</view>
<view class="tupianbox">
<image class="kuangimage" mode="scaleToFill" src="../image/meijia1.jpg" />
<image class="kuangimage" mode="scaleToFill" src="../image/meijia1.jpg" />
<image class="kuangimage" mode="scaleToFill" src="../image/meijia1.jpg" />
<image class="kuangimage" mode="scaleToFill" src="../image/meijia1.jpg" />
</view>
</view>
</view>
<!-- 商家 -->
<view style="width:100%;margin-top:20rpx" a:if="{{ showBusinessInfo }}">
<view style="margin-top:10rpx">
<view class="box3" style="margin-top:10rpx;"></view>
<text >店铺名称:{{businessName}}</text>
</view>
<view style="margin-top: 10rpx;">
<view class="box3" style="margin-top:10rpx"></view>
<text>联系电话:{{businessPhone}}</text>
</view>
<view style="margin-top: 10rpx;">
<view class="box3" style="margin-top:10rpx"></view>
<text>营业时间:{{startBusiness}}-{{endBusiness}}</text>
</view>
<view style="margin-top: 10rpx;">
<view class="box3" style="margin-top:10rpx"></view>
<text>店铺地址:{{address}}</text>
</view>
<view class="box3" style="margin-top:10rpx"></view>
</view>

View File

@ -0,0 +1,343 @@
import{url} from '../request'
Page({
data: {
lie: [
{ id: 1, name: '推荐款式', showLine: true },
{ id: 2, name: '中长款', showLine: false },
{ id: 3, name: '本甲款', showLine: false },
{ id: 4, name: '长款', showLine: false },
{ id: 5, name: '短款', showLine: false },
],
names:[
{ id:1, hengname:'款式分类',line:true},
{id:2,hengname:'评价',line:false},
{id:3,hengname:'商家',line:false},
],
userId: '',
address: '',
businessName:'',
businessAvatar:'',
startBusiness:'',
endBusiness:'',
storeStatus:'',
businessId: '',
commoditiesGroupId: 0,
commoditiesName: "",
current: 0,
pageSize: 0,
sortField: "",
sortOrder: "",
status: "",
tuijian:[],
meijiashi:[],
email: "",
gender: 0,
manicuristAvatar: "",
manicuristName: "",
phone: "",
rating: 0,
specialties: "",
id:'',
filteredShopping: [],
showShoppingCart: true, // 控制购物车部分是否显示
showComments: false, // 控制评论部分是否显示
showBusinessInfo: false, // 控制商家信息是否显示
pingjia:[],
},
onLoad(options) {
// Extract userId and address from options
const userId = options.userId;
const address = options.address;
const businessName = options.businessName;
const businessAvatar = options.businessAvatar;
const startBusiness = options.startBusiness;
const endBusiness = options.endBusiness;
const storeStatus = options.storeStatus;
const id = options.id
const businessPhone = options.businessPhone
console.log(id,'这是店铺id吗');
// Set them in data for use in the page
this.setData({
userId: userId,
address: address,
businessName:businessName,
businessAvatar:businessAvatar,
endBusiness:endBusiness,
startBusiness:startBusiness,
storeStatus:storeStatus,
id:id,
businessPhone:businessPhone,
});
my.request({
url: url + '/api/commodities/list/page/commodities',
method: 'POST',
data: {
businessId: id,
commoditiesGroupId: "",
commoditiesName: "",
current: 0,
pageSize: 100,
sortField: "",
sortOrder: "",
status: "",
},
headers: {
'content-type': 'application/json',
},
dataType: 'json',
success: (res) => {
console.log(id,'这是onload');
console.log('Request succeeded:', res);
if (res.data && res.data.data) {
this.setData({
tuijian: res.data.data.records, // 更新 tuijian 列表
});
this.chushihua();
console.log(this.data.tuijian,'这是推荐');
} else {
console.log('shibaile')
}
},
fail: (error) => {
console.error('Request failed', error);
}
});
this.pingjia()
},
soucang() {
my.getStorage({
key: 'userInfo',
success: (res) => {
const userInfo = res.data;
const businessId = this.data.id; // 获取 onLoad 中保存的 id
if (userInfo && userInfo.cookie) {
my.request({
url: url + '/api/collect/add',
method: 'POST',
data: {
businessId: businessId, // 使用 businessId 来请求收藏
userId: userInfo.id
},
headers: {
'content-type': 'application/json',
'Cookie': userInfo.cookie,
},
dataType: 'json',
success: (res) => {
console.log(res);
if(res.data.code===0){
my.alert({
content: '收藏成功'
});
}
else if(res.data.code===40100){
my.alert({
content: '登录信息已过期,请重新登录'
});
my.navigateTo({
url:'/pages/denglu/denglu'
})
}else{
my.alert({
content: '店铺已收藏'
});
}
},
fail: (error) => {
console.error('请求失败: ', JSON.stringify(error));
my.alert({ content: '请求失败,请稍后重试' });
},
});
} else {
my.alert({
content: '您未登录,请先登录。',
success: () => {
my.navigateTo({
url: '/pages/denglu/denglu',
});
},
});
}
},
});
},
pingjia(){
my.request({
url: url + '/api/level/listBusinessRating',
method: 'GET',
data: {
businessId:this.data.id,
},
headers: {
'content-type': 'application/json',
},
dataType: 'json',
success: (res) => {
console.log(res,'评价部分');
if(res.data.code===0){
this.setData({
pingjia:res.data.data,
useridpingjia:res.data.data.userId
})
}
},
fail: (error) => {
console.error('请求失败: ', JSON.stringify(error));
my.alert({ content: '请求失败,请稍后重试' });
},
});
},
zixun(){
my.navigateTo({
url:'/pages/zixunmeijiashi/zixunmeijiashi'
})
},
// 点击事件处理函数
selectItem(e) {
const id = e.currentTarget.dataset.id;
console.log(id);
// 更新对应的 showLine 状态,控制是否显示线条
const updatedLie = this.data.lie.map(item => {
if (item.id === id) {
item.showLine = !item.showLine; // 切换显示状态
} else {
item.showLine = false; // 其他项隐藏
}
return item;
});
// 根据点击的类别 id 筛选对应的商品
const filteredShopping = this.data.tuijian.filter(item => String(item.commoditiesGroupId) === String(id));
// 更新数据
this.setData({
lie: updatedLie,
filteredShopping, // 更新右侧商品列表
showShoppingCart: true, // 显示购物车部分
showComments: false, // 隐藏评论部分
showBusinessInfo: false, // 隐藏商家信息部分
});
console.log(this.data.filteredShopping,'hhhhhhhhhhhhhh');
},
chushihua(){
this.setData({
filteredShopping: this.data.tuijian.filter(item => String(item.commoditiesGroupId) === "1"), // 默认选中类别 1
})
console.log(this.data.filteredShopping,'chushi');
},
chaxunzhuangtai(e) {
const id = e.currentTarget.dataset.id;
console.log(id);
// 更新对应的 line 状态,控制是否显示线条
const updatednames = this.data.names.map(item => {
if (item.id === id) {
item.line = !item.line; // 切换显示状态
} else {
item.line = false; // 其他项隐藏
}
return item;
});
this.setData({
names: updatednames,
});
// 根据点击的分类切换显示内容
if (id === 1) {
this.setData({
showShoppingCart: true, // 显示购物车
showComments: false, // 隐藏评论
showBusinessInfo: false, // 隐藏商家信息
});
} else if (id === 2) {
this.setData({
showShoppingCart: false, // 隐藏购物车
showComments: true, // 显示评论
showBusinessInfo: false, // 隐藏商家信息
});
} else if (id === 3) {
this.setData({
showShoppingCart: false, // 隐藏购物车
showComments: false, // 隐藏评论
showBusinessInfo: true, // 显示商家信息
});
}
},
jiaru(item) {
const id = item.target.dataset.num
console.log('传递的数据:', id);
const ids = id.id
const businessId = id.businessId
my.getStorage({
key: 'userInfo',
success: (res) => {
const userInfo = res.data;
if (userInfo && userInfo.cookie) {
my.request({
url: url + '/api/cart/add',
method: 'POST',
data: {
businessId: businessId,
commoditiesId: ids,
quantity: 1,
selectedOptions: "",
userId: userInfo.id
},
headers: {
'content-type': 'application/json',
'Cookie': userInfo.cookie, // 通过头部传递 cookie
},
dataType: 'json',
success: (res) => {
if(res.data.code===0){
console.log(res);
my.alert({ content: '成功添加到购物车' });
}
else if(res.data.code===40100){
my.alert({
content: '登录信息已过期,请重新登录'
});
my.navigateTo({
url:'/pages/denglu/denglu'
})
}else{
console.log(res,'shibaile');
}
},
fail: (error) => {
console.error('请求失败: ', JSON.stringify(error));
my.alert({ content: '请求失败,请稍后重试' });
},
});
} else {
my.alert({
content: '您未登录,请先登录。',
success: () => {
my.navigateTo({
url: '/pages/denglu/denglu',
});
},
});
}
},
});
},
shangpinjiemian(item){
const id = item.target.dataset.num
console.log('传递的数据:', id);
const ids = id.id
const commoditiesPrice = id.commoditiesPrice
const commoditiesName = id.commoditiesName
const commoditiesImage = id.commoditiesImage
const businessId = id.businessId
const dianpuid = this.data.id
const businessName =this.data.businessName
console.log('Address being passed: ',id,commoditiesPrice,commoditiesName,commoditiesImage,businessId);
my.navigateTo({
url:`/pages/yuyuejiemian/yuyuejiemian?commoditiesPrice=${commoditiesPrice}&&commoditiesName=${commoditiesName}&&commoditiesImage=${commoditiesImage}&&ids=${ids}&&businessId=${businessId}&&dianpuid=${dianpuid}&&businessName=${businessName}`
})
console.log(ids,businessId,commoditiesImage,commoditiesName,commoditiesPrice+'这是商品的',dianpuid+'这是店铺的')
},
});

View File

@ -0,0 +1,5 @@
{
"defaultTitle": "店铺主页",
"usingComponents": {},
"styleIsolation": "apply-shared"
}

View File

@ -37,7 +37,7 @@
<!-- 店铺界面 -->
<view style="width:100%">
<view class="box2" >
<view class="kuang" a:for="{{ tuijian }}" a:key="{{index}}" data-num="{{item}}" onTap="dianpu">
<view class="kuang" a:for="{{ tuijian }}" a:key="{{index}}" a:if="{{ item.state==1 }}" data-num="{{item}}" onTap="dianpu">
<image class="image" mode="scaleToFill" src="{{item.businessAvatar}}" />
<view class="wenzi">
<text class="text">{{item.businessName}}</text>

View File

@ -1,223 +1,120 @@
.cebian {
width: 20%;
height: 100v;
background-color: #efeced;
overflow: hidden;
.box {
width: 100vw;
min-height: 100vh; /* 确保容器至少占满屏幕的高度 */
background-color: #eec2c7;
overflow-y: auto; /* 允许竖直方向滚动 */
width: 100vw; /* 或者 750rpx */
height: auto;
overflow:hidden; /* 防止溢出 */
}
.box3 {
display: flex;
flex-direction: column;
background-color: rgba(252, 240, 240, 0.807);
border-radius: 20px;
padding: 10px;
margin-bottom: 80px; /* 留出一些空间给底部结算栏 */
margin-top: 30rpx;
}
.box1 {
width: 100%;
height: 170px;
display: flex;
flex-direction: row;
}
.image {
width: 120px;
height: 120px;
border-radius: 10px;
position: relative;
left: 20px;
top: 20px;
}
.box4 {
position: relative;
top: 80px;
left: 10px;
width: 25px;
height: 25px;
}
.box5 {
height: 50px;
position: relative;
left: 40px;
top:30px;
}
.text {
width: 100%;
height: 50px;
padding: 5px;
}
.container {
width: 100px;
position: relative;
left: 100px;
top: 20px;
display: flex;
}
.boxd {
width: 100px;
height: 40px;
position: absolute;
border-radius: 30px;
background-color: rgb(162, 12, 12);
left: 570rpx;
display: flex;
justify-content: center;
align-items: center;
flex-direction: column;
cursor: pointer;
justify-content: center;
}
.color {
font-size: 14px;
color: rgb(0, 0, 0); /* 默认文字颜色 */
.text1 {
color: #ffffff;
position: unset;
}
.xian{
.boxall {
display: flex;
align-items: center;
padding: 10px;
position: fixed;
bottom: 0;
left: 0;
width: 100%;
background-color: #fff;
box-shadow: 0 -2px 5px rgba(0, 0, 0, 0.1);
}
.text2 {
position: relative;
left: 200rpx;
}
.text3{
height: 20px;
width: 60px;
height: 3px;
background-color: #f2819f;
margin-top: 5rpx;
position: absolute;
left: 620rpx;
font-size:12px;
color:#a8b0b8
}
.xinxi{
width: 80%;
height: 100%;
display: flex;
justify-content: center;
align-items: center;
flex-direction: column;
overflow-y: scroll
}
.pages{
width: 100%;
display: flex;
margin-top: 30rpx;
}
.shop{
width: 90%;
height:130px;
border: 1px solid #f2819f;
border-radius: 20px;
margin-top: 20rpx;
display: flex;
}
.image{
width: 100px;
height: 100px;
border-radius: 20px;
}
.imagebox{
width: 100px;
height: 130px;
display: flex;
align-items: center;
justify-content: center;
margin-left: 10rpx;
}
.dingwei{
position: relative;
}
.yuyue{
display: flex;
justify-content: center;
align-items: center;
width: 50px;
height: 20px;
border-radius: 20px;
border: 1px solid #fb96b1;
background-color: #fb96b1;
}
.yuyuekuang{
width: 100%;
display: flex;
justify-content: space-between;
}
.gouimage{
width: 20px;
height: 20px;
}
/* 店铺名框 */
.Box2
{
width: 100%;
height: 150px;
.number{
width: 30px;
background-color: white;
position: relative;
top:30px;
border-radius: 15px;
}
/* 店铺名 */
.z2{
font-size: 25px;
font-weight: bolder;
position: relative;
}
.image1{
width: 80px;
height: 20px;
margin-left: 10rpx;
margin-top: 20rpx;
}
.z3{
position: relative;
left: 30rpx;
bottom: 8rpx;
color: rgb(194, 53, 53);
}
.z4{
position: relative;
left: 80rpx;
bottom:10rpx;
}
/* 营业时间 */
.z6{
color: #4095E5;
font-weight: bolder;
top:20px;
left: 10px;
position: relative;
}
.z7{
position: relative;
top:38rpx;
left: 30rpx;
font-size: 13px;
}
.box3{
width: 100%;
height: 1px;
background-color: darkgrey;
}
/* 地址 */
.z8{
font-size: 12px;
margin-left: 10rpx;
}
.image3{
width: 10px;
height: 12px;
margin-left: 5rpx;
}
.box4{
width: 100%;
height: 1px;
background-color: darkgrey;
margin-top: 10rpx;
}
.shangimage{
width: 200rpx;
height: 200rpx;
border-radius: 10%;
margin-left: 20rpx;
}
.box8{
width: 500rpx;
height: 200rpx;
position: relative;
left: 230rpx;
bottom: 200rpx;
}
.tiao{
width: 100px;
display: flex;
justify-content: center;
align-items: center;
flex-direction: column;
}
.tiaobox{
width: 100%;
height: 30px;
display: flex;
}
.pingjia{
width: 100%;
display: flex;
justify-content: center;
margin-top: 10rpx;
}
.pingjiakuang{
width: 90%;
border-top: #6e7071 1px solid;
height: auto;
}
.pingjiaimage{
width: 40px;
height: 40px;
border-radius: 50px;
}
.touxiang{
width: 100%;
height: 40px;
display: flex;
align-items: center;
margin-top: 10rpx;
}
.kuangimage{
width: 100px;
height: 100px;
margin:10rpx 10rpx 10rpx 10rpx;
border-radius: 10px;
}
.tupianbox{
width: 100%;
.beijing{
display: flex;
justify-content: center;
}
.soucangimage{
width: 30px;
height: 30px;
position: absolute;
right: 80rpx;
top: -40rpx;
}
.zixunimage{
width: 30px;
height: 30px;
position: absolute;
right: 0rpx;
top: -40rpx;
align-items: center;
width: 25px;
height: 25px;
background-color: white;
font-size: 20p;
}

View File

@ -1,124 +1,46 @@
<!-- 店铺名框 -->
<view class="Box2" >
<image class="shangimage" mode="scaleToFill" src="{{businessAvatar}}" />
<view class="box8">
<text class="z2">{{businessName}}</text>
<view style="margin-top:10rpx">
<image mode="scaleToFill" class="image1" src="../image/xingji.png" />
<text class="z3">4.9</text>
<text class="z4">500条</text>
</view>
<view onTap="soucang">
<image class="soucangimage" mode="scaleToFill" src="../image/shoucang.png" />
</view>
<view>
<image class="zixunimage" mode="scaleToFill" src="../image/zixun.png" />
</view>
</view>
</view>
<!-- 营业时间 -->
<view style="width:100%;height:90px">
<view style="height:50px">
<text class="z6" a:if="{{storeStatus === '0'}}">已休息</text>
<text class="z6" a:if="{{storeStatus === '1'}}">营业中</text>
<text class="z7">营业时间:{{startBusiness}}-{{endBusiness}}</text>
</view>
<view>
<view class="box3"></view>
</view>
<!-- 地址 -->
<view style="width:100%;height:50px">
<image class="image3" mode="scaleToFill" src="../image/didian.png" />
<text class="z8">{{address}}</text>
<view>
<view class="box4"></view>
</view>
</view>
</view>
<view class="tiaobox">
<view class="tiao" a:for="{{ names }}" onTap="chaxunzhuangtai" data-id={{item.id}}>
<text>{{item.hengname}}</text>
<view class="xian" a:if="{{item.line}}" ></view>
</view>
</view>
<!-- 购物车 -->
<view class="pages" a:if="{{ showShoppingCart }}">
<!-- 侧边栏 -->
<view class="cebian">
<view class="text"
a:for="{{ lie }}"
onTap="selectItem"
data-id="{{item.id}}">
<text class="color">{{item.name}}</text>
<view>
<!-- 动态绑定 xian 是否显示 -->
<view class="xian" a:if="{{item.showLine}}"></view>
</view>
</view>
</view>
<view class="xinxi">
<view class="shop" a:for="{{ filteredShopping }}">
<view class="imagebox">
<view class="box">
<!-- 购物车店铺 -->
<view class="box3">
<checkbox-group onChange="checkboxChange">
<block a:for="{{productList}}" a:key="id">
<view class="box1">
<view class="box4">
<!-- 给每个复选框绑定 data-index -->
<checkbox color="red" checked="{{item.checked}}" value="{{item.cartId}}" />
</view>
<image class="image" mode="scaleToFill" src="{{item.commoditiesImage}}" />
<view class="box5">
<view>
<text class="text" style="font-size:20px">{{item.commoditiesName}}</text>
</view>
<view>
<text class="text" style="font-size:15px">¥{{item.commoditiesPrice}}</text>
</view>
<view class="container">
<view class="beijing" data-index="{{index}}" style="margin-right: 10rpx;" onTap="decreaseQuantity" >
<text>-</text>
</view>
<view class="number">
<text >{{item.quantity}}</text>
</view>
<view class="beijing" style="margin-left: 10rpx;"onTap="increaseQuantity" data-index="{{index}}" >
<text >+</text>
</view>
</view>
</view>
<text class="text3" onTap="yichu" data-id="{{item.cartId}}">移除购物车</text>
</view>
<view style="width:100%">
<view class="dingwei" style="width:120px;height:20px;top: 35rpx;">
<text>{{item.commoditiesName}}</text>
</view>
<view class="dingwei" style="width:170px;height:40px;top:50rpx">
<text style="font-size:12px;color:#9c9a9a">款式随便做,饰品不限量,含甲片,含卸甲</text>
</view>
<view class="yuyuekuang dingwei" style="top:30px">
<text>¥{{item.commoditiesPrice}}</text>
<view class="yuyue">
<text>预约</text>
</view>
</view>
<view class="dingwei" style="left:300rpx;bottom:130rpx" onTap="soucang">
<image class="gouimage" mode="scaleToFill" src="../image/tijiagouwuche.png" />
</view>
</view>
</block>
</checkbox-group>
</view>
<!-- 底部结算栏 -->
<view class="boxall">
<checkbox color="red" checked="{{select_all}}" onChange="selectall"/>全选
<text class="text2">合计:¥{{totalPrice}}</text>
<view class="boxd" onTap="jiesuan">
<text class="text1">结算</text>
</view>
</view>
</view>
<!-- 评价 -->
<view class="pingjia" a:if="{{ showComments }}">
<view class="pingjiakuang">
<view class="touxiang">
<image class="pingjiaimage" mode="scaleToFill" src="../image/meijia1.jpg" />
<text style="margin-left:10rpx">陌路</text>
</view>
<view style="width:100%">
<text style="color:#8a8f93;font-size:13px">颜色冰透系列裸色01色+烤灯-简约</text>
<view style="width:100%;word-wrap: break-word;">
<text>aslkjhdklajshdkalsdhaskljdhaskldhaskhdaksjhdkjsh</text>
</view>
</view>
<view class="tupianbox">
<image class="kuangimage" mode="scaleToFill" src="../image/meijia1.jpg" />
<image class="kuangimage" mode="scaleToFill" src="../image/meijia1.jpg" />
<image class="kuangimage" mode="scaleToFill" src="../image/meijia1.jpg" />
<image class="kuangimage" mode="scaleToFill" src="../image/meijia1.jpg" />
</view>
</view>
</view>
<!-- 商家 -->
<view style="width:100%;margin-top:20rpx" a:if="{{ showBusinessInfo }}">
<view style="margin-top:10rpx">
<view class="box3" style="margin-top:10rpx;"></view>
<text >店铺名称:{{businessName}}</text>
</view>
<view style="margin-top: 10rpx;">
<view class="box3" style="margin-top:10rpx"></view>
<text>联系电话:{{businessPhone}}</text>
</view>
<view style="margin-top: 10rpx;">
<view class="box3" style="margin-top:10rpx"></view>
<text>营业时间:{{startBusiness}}-{{endBusiness}}</text>
</view>
<view style="margin-top: 10rpx;">
<view class="box3" style="margin-top:10rpx"></view>
<text>店铺地址:{{address}}</text>
</view>
<view class="box3" style="margin-top:10rpx"></view>
</view>

View File

@ -1,143 +1,181 @@
import{url} from '../request'
import { url } from '../request';
Page({
data: {
lie: [
{ id: 1, name: '推荐款式', showLine: true },
{ id: 2, name: '中长款', showLine: false },
{ id: 3, name: '本甲款', showLine: false },
{ id: 4, name: '长款', showLine: false },
{ id: 5, name: '短款', showLine: false },
],
names:[
{ id:1, hengname:'款式分类',line:true},
{id:2,hengname:'评价',line:false},
{id:3,hengname:'商家',line:false},
],
userId: '',
address: '',
businessName:'',
businessAvatar:'',
startBusiness:'',
endBusiness:'',
storeStatus:'',
businessId: '',
commoditiesGroupId: 0,
commoditiesName: "",
current: 0,
pageSize: 0,
sortField: "",
sortOrder: "",
status: "",
tuijian:[],
meijiashi:[],
email: "",
gender: 0,
manicuristAvatar: "",
manicuristName: "",
phone: "",
rating: 0,
specialties: "",
id:'',
filteredShopping: [],
showShoppingCart: true, // 控制购物车部分是否显示
showComments: false, // 控制评论部分是否显示
showBusinessInfo: false, // 控制商家信息是否显示
id: '',
productList: [], // 商品列表
select_all: false,
checkbox_productListid: '',
totalPrice: 0,
},
onLoad(options) {
// Extract userId and address from options
const userId = options.userId;
const address = options.address;
const businessName = options.businessName;
const businessAvatar = options.businessAvatar;
const startBusiness = options.startBusiness;
const endBusiness = options.endBusiness;
const storeStatus = options.storeStatus;
const id = options.id
const businessPhone = options.businessPhone
console.log(id,'zheyedesaksdas');
// Set them in data for use in the page
// 计算总价
calculateTotalPrice() {
const totalPrice = this.data.productList
.filter(item => item.checked) // 只计算勾选的商品
.reduce((sum, item) => sum + item.quantity * item.commoditiesPrice, 0);
// 格式化总价为两位小数
const formattedTotalPrice = totalPrice.toFixed(2);
// 更新 totalPrice
this.setData({ totalPrice: formattedTotalPrice });
},
// 增加商品数量
increaseQuantity(e) {
const { index } = e.currentTarget.dataset; // 获取当前商品的索引
const updatedProductList = [...this.data.productList];
const item = updatedProductList[index];
// 增加数量
if (item.quantity < 999) {
item.quantity += 1;
}
this.setData({ productList: updatedProductList });
this.calculateTotalPrice(); // 重新计算总价
},
// 减少商品数量
decreaseQuantity(e) {
const { index } = e.currentTarget.dataset; // 获取当前商品的索引
const updatedProductList = [...this.data.productList];
const item = updatedProductList[index];
// 减少数量
if (item.quantity > 1) {
item.quantity -= 1;
}
this.setData({ productList: updatedProductList });
this.calculateTotalPrice(); // 重新计算总价
},
// 全选/取消全选
selectall(e) {
const newSelectAll = !this.data.select_all;
const updatedProductList = this.data.productList.map(item => ({
...item,
checked: newSelectAll,
}));
const checkbox_productListid = newSelectAll
? updatedProductList.map(item => item.cartId).join(',')
: '';
this.setData({
userId: userId,
address: address,
businessName:businessName,
businessAvatar:businessAvatar,
endBusiness:endBusiness,
startBusiness:startBusiness,
storeStatus:storeStatus,
id:id,
businessPhone:businessPhone,
productList: updatedProductList,
select_all: newSelectAll,
checkbox_productListid,
});
my.request({
url: url + '/api/commodities/list/page/commodities',
method: 'POST',
data: {
businessId: id,
commoditiesGroupId: id,
commoditiesName: "",
current: 0,
pageSize: 2,
sortField: "",
sortOrder: "",
status: "",
},
headers: {
'content-type': 'application/json',
},
dataType: 'json',
success: (res) => {
console.log(id,'这是onload');
console.log('Request succeeded:', res);
if (res.data && res.data.data) {
this.setData({
tuijian: res.data.data.records, // 更新 tuijian 列表
});
this.chushihua();
console.log(this.data.tuijian,'这是推荐');
} else {
console.log('shibaile')
}
},
fail: (error) => {
console.error('Request failed', error);
}
console.log("arr=", checkbox_productListid);
this.calculateTotalPrice(); // 重新计算总价
const selectedProducts = updatedProductList.filter(item => item.checked);
this.setData({
selectedProducts, // 存储勾选的商品信息
});
console.log(selectedProducts);
},
soucang() {
checkboxChange(e) {
const { value } = e.detail; // 当前选中的值列表
const updatedProductList = this.data.productList.map(item => ({
...item,
checked: value.includes(item.cartId.toString()),
}));
const select_all = updatedProductList.every(item => item.checked);
this.setData({
productList: updatedProductList,
select_all,
});
this.calculateTotalPrice(); // 更新总价
// 提取勾选的商品
const selectedProducts = updatedProductList.filter(item => item.checked);
this.setData({
selectedProducts, // 存储勾选的商品信息
});
console.log(selectedProducts,'askldjaslkdaslkdjklas');
},
// 获取商品数据
fetchProductDetails(cartItems) {
const promises = cartItems.map((item) => {
return new Promise((resolve, reject) => {
my.request({
url: url + '/api/commodities/getById/commodities',
method: 'GET',
data: { id: item.commoditiesId },
headers: { 'content-type': 'application/json' },
success: (res) => {
if (res.data.code === 0) {
const productData = res.data.data;
productData.cartId = item.id; // 将 cartId 添加到商品数据中
productData.quantity = item.quantity || 1; // 初始化数量
resolve(productData);
} else {
reject(`商品信息获取失败: ${res.data.message}`);
}
},
fail: (error) => {
reject(error);
},
});
});
});
Promise.all(promises)
.then((productList) => {
// 确保没有重复商品
const mergedProductList = [];
productList.forEach((product) => {
const existingProduct = mergedProductList.find(
(item) => item.commoditiesId === product.commoditiesId
);
if (existingProduct) {
// 如果已存在相同商品,则累加数量
existingProduct.quantity += product.quantity;
} else {
// 如果是新商品,则添加
mergedProductList.push(product);
}
});
this.setData({ productList: mergedProductList });
this.calculateTotalPrice(); // 初始化总价
})
.catch((error) => {
console.error('商品信息获取失败: ', error);
my.alert({ content: '商品信息获取失败,请稍后重试' });
});
},
// 页面加载时获取商品数据
onShow() {
this.setData({
select_all: false,
selectedProducts:[],
});
my.getStorage({
key: 'userInfo',
success: (res) => {
const userInfo = res.data;
const businessId = this.data.id; // 获取 onLoad 中保存的 id
if (userInfo && userInfo.cookie) {
my.request({
url: url + '/api/collect/add',
url: url + '/api/cart/selectByUserId',
method: 'POST',
data: {
businessId: businessId // 使用 businessId 来请求收藏
},
data: {
id: userInfo.id
},
headers: {
'content-type': 'application/json',
'Cookie': userInfo.cookie,
},
dataType: 'json',
success: (res) => {
if(res.data.code===0){
console.log(res,'hhhhhhhhhhhh');
if (res.data.code === 0) {
console.log(res);
const cartItems = res.data.data;
this.fetchProductDetails(cartItems);
} else {
my.alert({
content: '收藏成功'
});
}
else if(res.data.code===40100){
my.alert({
content: '登录信息已过期,请重新登录'
content: '登录信息已过期,请重新登录',
});
my.navigateTo({
url:'/pages/denglu/denglu'
})
}else{
my.alert({
content: '店铺已收藏'
url: '/pages/denglu/denglu',
});
}
},
@ -146,13 +184,66 @@ Page({
my.alert({ content: '请求失败,请稍后重试' });
},
});
} else {
}
else{
my.alert({
content: '您未登录,请先登录。',
success: () => {
my.navigateTo({
url: '/pages/denglu/denglu',
});
content:'您未登录,请先登录'
})
my.navigateTo({
url:'/pages/denglu/denglu'
})
}
},
});
},
yichu(e) {
const cartId = e.currentTarget.dataset.id; // 获取商品的 cartId
if (!cartId) {
console.error('没有找到商品cartId');
my.alert({ content: '商品ID未找到请稍后重试' });
return;
}
console.log('需要移除的商品cartId:', cartId);
my.getStorage({
key: 'userInfo',
success: (res) => {
const userInfo = res.data;
if (userInfo && userInfo.cookie) {
// 发送请求移除商品
my.request({
url: url + '/api/cart/delete',
method: 'POST',
data: {
id: cartId, // 商品 cartId
userId: userInfo.id, // 当前用户ID
},
headers: {
'content-type': 'application/json',
'Cookie': userInfo.cookie,
},
dataType: 'json',
success: (res) => {
if (res.data.code === 0) {
my.alert({ content: '成功移除商品' });
// 从 productList 中移除对应的商品
const updatedProductList = this.data.productList.filter(
(item) => item.cartId !== cartId
);
this.setData({ productList: updatedProductList });
this.calculateTotalPrice(); // 更新总价
} else {
my.alert({ content: '移除商品失败,请稍后重试' });
console.log(res);
}
},
fail: (error) => {
console.error('请求失败: ', JSON.stringify(error));
my.alert({ content: '请求失败,请稍后重试' });
},
});
}
@ -160,127 +251,54 @@ Page({
});
},
// meijiahsi(){
// my.request({
// url: url + '/api/manicurist/userQueryAll',
// method: 'GET',
// data: {
// businessId: this.data.id
// },
// headers: {
// 'content-type': 'application/json',
// },
// dataType: 'json',
// success: (res) => {
// console.log('Request succeeded:', res);
// if (res.data && res.data.data) {
// this.setData({
// meijiashi: res.data.data, // 更新 tuijian 列表
// });
// } else {
// console.log('shibaile')
// }
// },
// fail: (error) => {
// console.error('Request failed', error);
// }
// });
// },
pingjia(){
my.navigateTo({
url:'/pages/shangpinpingjia/shangpinpingjia'
})
// 移除后更新
updateCartList() {
this.setData({ select_all: false });
my.getStorage({
key: 'userInfo',
success: (res) => {
const userInfo = res.data;
if (userInfo && userInfo.cookie) {
my.request({
url: url + '/api/cart/selectByUserId', // 获取最新的购物车数据
method: 'POST',
data: {
id: this.data.id
}, // 使用当前用户ID
headers: {
'content-type': 'application/json',
'Cookie': userInfo.cookie
},
dataType: 'json',
success: (res) => {
if (res.data.code === 0) {
const cartItems = res.data.data;
this.fetchProductDetails(cartItems, userInfo.id);
} else {
my.alert({ content: '获取购物车数据失败,请稍后重试' });
}
},
fail: (error) => {
console.error('请求失败: ', JSON.stringify(error));
my.alert({ content: '请求失败,请稍后重试' });
},
});
}
},
});
},
zixun(){
my.navigateTo({
url:'/pages/zixunmeijiashi/zixunmeijiashi'
})
},
shangpinjiemian(item){
const id = item.target.dataset.num
console.log('传递的数据:', id);
const ids = id.id
const commoditiesPrice = id.commoditiesPrice
const commoditiesName = id.commoditiesName
const commoditiesImage = id.commoditiesImage
const businessId = id.businessId
console.log('Address being passed: ',id,commoditiesPrice,commoditiesName,commoditiesImage,businessId);
my.navigateTo({
url:`/pages/shangpinjiemian/shangpinjiemian?commoditiesPrice=${commoditiesPrice}&&commoditiesName=${commoditiesName}&&commoditiesImage=${commoditiesImage}&&ids=${ids}&&businessId=${businessId}`
})
console.log(ids,businessId,commoditiesImage,commoditiesName,commoditiesPrice+'这是商品的')
},
// 点击事件处理函数
selectItem(e) {
const id = e.currentTarget.dataset.id;
console.log(id);
// 更新对应的 showLine 状态,控制是否显示线条
const updatedLie = this.data.lie.map(item => {
if (item.id === id) {
item.showLine = !item.showLine; // 切换显示状态
} else {
item.showLine = false; // 其他项隐藏
jiesuan() {
const products = this.data.selectedProducts;
if(!products || products.length === 0){
my.alert({
content:'请选择商品'
})
}else{
const productsStr = JSON.stringify(products)
const prices =this.data.totalPrice
my.navigateTo({
url: '/pages/zhifujiemian/zhifujiemian?products='+encodeURIComponent(productsStr)+ '&prices=' + encodeURIComponent(prices)
});
}
return item;
});
// 根据点击的类别 id 筛选对应的商品
const filteredShopping = this.data.tuijian.filter(item => String(item.commoditiesGroupId) === String(id));
// 更新数据
this.setData({
lie: updatedLie,
filteredShopping, // 更新右侧商品列表
showShoppingCart: true, // 显示购物车部分
showComments: false, // 隐藏评论部分
showBusinessInfo: false, // 隐藏商家信息部分
});
console.log(this.data.filteredShopping,'hhhhhhhhhhhhhh');
},
chushihua(){
this.setData({
filteredShopping: this.data.tuijian.filter(item => String(item.commoditiesGroupId) === "1"), // 默认选中类别 1
})
console.log(this.data.filteredShopping,'chushi');
},
chaxunzhuangtai(e) {
const id = e.currentTarget.dataset.id;
console.log(id);
// 更新对应的 line 状态,控制是否显示线条
const updatednames = this.data.names.map(item => {
if (item.id === id) {
item.line = !item.line; // 切换显示状态
} else {
item.line = false; // 其他项隐藏
}
return item;
});
this.setData({
names: updatednames,
});
// 根据点击的分类切换显示内容
if (id === 1) {
this.setData({
showShoppingCart: true, // 显示购物车
showComments: false, // 隐藏评论
showBusinessInfo: false, // 隐藏商家信息
});
} else if (id === 2) {
this.setData({
showShoppingCart: false, // 隐藏购物车
showComments: true, // 显示评论
showBusinessInfo: false, // 隐藏商家信息
});
} else if (id === 3) {
this.setData({
showShoppingCart: false, // 隐藏购物车
showComments: false, // 隐藏评论
showBusinessInfo: true, // 显示商家信息
});
}
},
});
},
});

View File

@ -43,8 +43,8 @@
}
.image1{
max-width: 35px;
max-height: 25px;
max-width: 30px;
max-height: 30px;
position:relative;
}
/* 退出登录 */

View File

@ -15,6 +15,7 @@ Page({
this.setData({
username: userInfo.username,
avatarUrl: userInfo.avatarUrl,
messagelogin:userInfo,
});
}else{
this.setData({
@ -56,10 +57,18 @@ Page({
});
},
login() {
my.navigateTo({
url: '/pages/denglu/denglu'
});
if (!this.data.messagelogin) {
my.navigateTo({
url: '/pages/denglu/denglu'
});
} else {
my.showToast({
content: '您已登录,无需重复登录',
duration: 2000 // 提示持续时间
});
}
},
meijishi() {
my.navigateTo({
url: '/pages/meijiashirenzheng/meijiashirenzheng'

View File

@ -73,7 +73,7 @@
<text class="text" style="bottom:70rpx;right:190rpx;color:#377ff3">到店服务</text>
<text class="text"style="bottom:100rpx;left:80rpx;font-size:18px">¥{{item.commoditiesVO.commoditiesPrice}}</text>
<view class="text" style="left:440rpx;display:flex;width:150rpx;bottom:20rpx">
<view>
<view onTap="quxiao" data-id="{{item.id}}">
<text class="textcss">取消</text>
</view>
<view>

View File

@ -55,7 +55,9 @@ Page({
paymentStatus: "",
sortField: "",
sortOrder: "",
startTime: ""
startTime: "",
userId: userInfo.id,
userRole: 0,
},
headers: {
'content-type': 'application/json',
@ -126,5 +128,108 @@ getPaymentStatusText(status) {
const statusObj = this.paymentStatuses.find(item => item.paymentStatuses === status.toString());
return statusObj ? statusObj.statue : '未知状态'; // 如果找不到对应状态,返回 '未知状态'
},
quxiao(e){
const orderId = e.currentTarget.dataset.id;
console.log(orderId,'zheshiorderid');
my.getStorage({
key: 'userInfo',
success: (res) => {
const userInfo = res.data;
this.setData({
id: userInfo.id, // 获取 id
});
if (userInfo && userInfo.cookie) {
my.request({
url: url + '/api/orders/cancel',
method: 'POST',
data: {
"id": 0
},
headers: {
'content-type': 'application/json',
'Cookie': userInfo.cookie,
},
dataType: 'json',
success: (res) => {
if(res.data.code===0){
my.showToast({
content: '订单已取消',
});
this.fetchOrders()
}
else if(res.data.code===40100){
my.alert({
content: '登录信息已过期,请重新登录'
});
my.navigateTo({
url:'/pages/denglu/denglu'
})
}
console.log(res);
console.log(this.data.dingdan);
},
fail: (error) => {
console.error('请求失败: ', JSON.stringify(error));
my.alert({ content: '请求失败,请稍后重试' });
},
});
}
else {
my.alert({
content: '您未登录,请先登录。',
success: () => {
my.navigateTo({
url: '/pages/denglu/denglu',
});
},
});
}
},
});
},
fetchOrders() {
my.getStorage({
key: 'userInfo',
success: (res) => {
const userInfo = res.data;
if (userInfo && userInfo.cookie) {
my.request({
url: url + '/api/orders/my/page',
method: 'POST',
data: {
claimStatus: 0,
current: 1,
endTime: "",
id: "",
pageSize: 10,
paymentStatus: "",
sortField: "",
sortOrder: "",
startTime: "",
userId: userInfo.id,
userRole: 0,
},
headers: {
'content-type': 'application/json',
'Cookie': userInfo.cookie,
},
dataType: 'json',
success: (res) => {
if (res.data.code === 0) {
this.setData({
dingdan: res.data.data.records,
});
}
},
fail: (error) => {
console.error('请求失败: ', JSON.stringify(error));
my.alert({ content: '请求失败,请稍后重试' });
},
});
}
},
});
}
});

View File

@ -19,64 +19,47 @@ Page({
],
},
// onShow(){
// my.getStorage({
// key: 'userInfo',
// success: (res) => {
// const userInfo = res.data;
// this.setData({
// id: userInfo.id, // 获取 id
// });
onShow(){
my.getStorage({
key: 'userInfo',
success: (res) => {
const userInfo = res.data;
this.setData({
id: userInfo.id, // 获取 id
});
// if (userInfo && userInfo.cookie) {
// my.request({
// url: url + '/api/orders/my/page',
// method: 'POST',
// data: {
// claimStatus: 0,
// current: 1,
// endTime: "",
// id: "",
// pageSize: 10,
// paymentStatus: 0,
// sortField: "",
// sortOrder: "",
// startTime: ""
// },
// headers: {
// 'content-type': 'application/json',
// 'Cookie': userInfo.cookie,
// },
// dataType: 'json',
// success: (res) => {
// if(res.data&&res.data.data){
// this.setData({
// dingdan:res.data.data.records,
// })
// }
// console.log(res);
// console.log(this.data.dingdan);
// console.log(this.data.dingdan);
// },
// fail: (error) => {
// console.error('请求失败: ', JSON.stringify(error));
// my.alert({ content: '请求失败,请稍后重试' });
// },
// });
// } else {
// my.alert({
// content: '您未登录,请先登录。',
// success: () => {
// my.navigateTo({
// url: '/pages/denglu/denglu',
// });
// },
// });
// }
// },
// });
// },
if (userInfo) {
my.request({
url: url + '/api/level/list',
method: 'POST',
data: {
},
headers: {
'content-type': 'application/json',
},
dataType: 'json',
success: (res) => {
console.log(res,"sadkaskd");
},
fail: (error) => {
console.error('请求失败: ', JSON.stringify(error));
my.alert({ content: '请求失败,请稍后重试' });
},
});
} else {
my.alert({
content: '您未登录,请先登录。',
success: () => {
my.navigateTo({
url: '/pages/denglu/denglu',
});
},
});
}
},
});
},
// tab栏
onSwipeChange(e) {
this.setData({

View File

@ -29,11 +29,14 @@ Page({
key: 'userInfo',
success: (res) => {
const userInfo = res.data;
console.log(userInfo.id);
if (userInfo && userInfo.cookie) {
my.request({
url: url + '/api/collect/list',
method: 'POST',
data: {},
data: {
id:userInfo.id
},
headers: {
'content-type': 'application/json',
'Cookie': userInfo.cookie,
@ -158,7 +161,9 @@ Page({
my.request({
url: url + '/api/collect/list',
method: 'POST',
data: {},
data: {
id:userInfo.id
},
headers: {
'content-type': 'application/json',
'Cookie': userInfo.cookie,
@ -183,7 +188,13 @@ Page({
my.alert({ content: '请求失败,请稍后重试' });
},
});
}
}
else{
my.alert({content:'您未登录,请先登录'})
my.navigateTo({
url:'/pages/denglu/denglu'
})
}
},
});
},

View File

@ -18,8 +18,10 @@
position: relative;
}
.neirong{
display: flex;
flex-direction: column;
margin-left: 20rpx;
width: 200px;
width: 50%;
}
.shijian{
display: flex;
@ -31,13 +33,22 @@
.image1{
width: 50rpx;
height: 50rpx;
margin-top: 20rpx;
position: relative;
left: 330rpx;
}
.yemian{
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
}
.statues{
width: 50%;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
}
.xinxibox{
width: 100%;
display: flex;
}

View File

@ -1,24 +1,33 @@
<view class="yemian" a:for="{{ yuyue }}">
<view class="yemian" a:for="{{ myyuyue }}">
<view class="box">
<view class="biaoti">
<image class="image" mode="scaleToFill" src="/pages/image/alogo.png" />
<text class="text" style="bottom:60rpx">{{item.name}}</text>
<text class="text" style="bottom:60rpx">{{item.businessName}}</text>
<view class="text" style="left:120rpx;bottom:60rpx">
<text style="font-size:13px">{{item.neirong}}</text>
<text style="font-size:13px">{{item.notes}}</text>
</view>
</view>
<view class="neirong">
<view style="margin-top:20rpx">
<text>我的预约:{{item.shijian}}</text>
<view class="xinxibox">
<view class="neirong">
<view style=" width:300px;margin-top:20rpx">
<text>我的预约:{{item.formattedAppointmentTime}}</text>
</view>
<view style="margin-top:10rpx">
<text a:if="{{ item.serviceMode==1 }}">服务方式:到店服务</text>
<text a:if="{{ item.serviceMode==0 }}">服务方式:上门服务</text>
</view>
<view style="margin-top:10rpx">
<text class="text">指定美甲师:{{item.manicuristName}}</text>
</view>
</view>
<view style="margin-top:20rpx">
<text class="text" style="bottom:40rpx">指定美甲师:{{item.meijiashi}}</text>
<image mode="scaleToFill" class="image1" src="/pages/image/aing.png" />
<view class="statues" a:if="{{ item.status==0 }}">
<image mode="scaleToFill" class="image1" src="/pages/image/aing.png" />
<text style="margin-top:20rpx">正在进行中......</text>
</view>
<view class="statues" a:if="{{ item.status==1 }}">
<image mode="scaleToFill" class="image1" src="/pages/image/afinish.png" />
<text style="margin-top:20rpx">已完成</text>
</view>
</view>
<view class="shijian" >
<text>{{item.data}}</text>
<text style="margin-right:50rpx">{{item.status}}</text>
</view>
</view>
</view>

View File

@ -1,5 +1,7 @@
import {url} from '../request'
Page({
data: {
myyuyue:[],
yuyue:[
{
name:'佳佳温馨提示:',
@ -43,5 +45,62 @@ Page({
}
]
},
onLoad() {},
onShow() {
my.getStorage({
key: 'userInfo',
success: (res) => {
const userInfo = res.data;
if (userInfo && userInfo.cookie) {
my.request({
url: url + '/api/appointments/query',
method: 'POST',
data: {
id: userInfo.id
},
headers: {
'content-type': 'application/json',
'Cookie': userInfo.cookie,
},
dataType: 'json',
success: (res) => {
console.log(res);
// 在这里处理后端返回的时间字段
const appointments = res.data.data.map(item => {
const appointmentTime = new Date(item.appointmentTime); // 将时间字符串转换为 Date 对象
// 格式化日期为 'YYYY-MM-DD HH:mm' 形式
const formattedDate = appointmentTime.getFullYear() + '-'
+ ('0' + (appointmentTime.getMonth() + 1)).slice(-2) + '-'
+ ('0' + appointmentTime.getDate()).slice(-2) + ' '
+ ('0' + appointmentTime.getHours()).slice(-2) + ':'
+ ('0' + appointmentTime.getMinutes()).slice(-2);
// 返回新的数组,带有格式化后的日期
return {
...item,
formattedAppointmentTime: formattedDate
};
});
this.setData({
myyuyue: appointments
});
console.log(this.data.myyuyue);
},
fail: (error) => {
console.error('请求失败: ', JSON.stringify(error));
my.alert({ content: '请求失败,请稍后重试' });
},
});
} else {
my.alert({ content: '您未登录,请先登录' });
my.navigateTo({
url: '/pages/denglu/denglu'
});
}
},
});
},
});

View File

@ -0,0 +1,123 @@
/* 商品图背景 */
.image{
width: 100%;
height: 300px;
}
/* 价格 */
.box1{
width: 100%;
display: flex;
background-color: #eec2c7;
position: relative;
border-radius: 15px;
}
.z1{
top: 20rpx;
left: 20rpx;
position: relative;
}
.z2{
font-weight: bolder;
font-size: 20px;
}
.z3{
font-size: 22px;
font-weight: bolder;
}
.z4{
position: relative;
color: rgb(29, 18, 18);
}
.box8{
display:flex;
flex-direction: column;
width: 60%;
}
/* 商品介绍 */
.z5{
font-size: 15px;
color: darkgrey;
}
.time{
width: 100%;
height: auto;
border-top: 2px solid #aba8a8;
margin-top: 40rpx;
margin-bottom: 130rpx;
border-radius: 20px;
}
.yuyuetext{
width: 100%;
height: 50px;
}
.timebox{
width: 100px;
height: 40px;
border: 1px solid #8f8c8c;
border-radius: 10px;
margin-left: 20rpx;
display: flex;
justify-content: center;
align-items: center;
margin-top: 10rpx;
}
.boxtextkuang{
width: 100%;
height: 180px;
display: flex;
flex-wrap: wrap;
justify-content: space-evenly;
gap: 10px;
}
.miajishikuang {
display: flex;
flex-wrap: wrap; /* 允许换行 */
justify-content: flex-start; /* 使项目均匀分布 */
gap: 10px;
}
.meijishsibox {
width: 23%;
text-align: center;
}
.meijiashiimage {
width: 70px;
height: 70px;
border-radius: 50%;
display: block;
margin: 0 auto;
}
.mejiashitext {
margin-top: 5px;
display: flex;
justify-content: center;
}
.duihaoimage {
width: 20px;
height: 20px;
}
.duihaoimage{
width: 20px;
height: 20px;
}
.zhifubox{
width: 100%;
display: flex;
justify-content: center;
align-items: center;
position:fixed;
bottom: 40rpx;
}
.zhifuzhong{
width: 90%;
height: 50px;
background-color: #eec2c7;
border-radius: 30px;
display: flex;
justify-content: center;
align-items: center;
}
.textbox{
width: 30%;
display: flex;
flex-direction: column;
}

View File

@ -0,0 +1,50 @@
<view>
<!-- 商品图 -->
<image class="image" mode="scaleToFill" src="{{commoditiesImage}}" />
<!-- 价格表 -->
<view class="box1">
<view class="textbox">
<text class="z1">年售1000+</text>
<view style="margin-top:30rpx">
<text class="z2">¥{{commoditiesPrice}}</text>
</view>
</view>
<view class="box8">
<text class="z3">【{{commoditiesName}}】</text>
<text class="z4">款式随便做,饰品不限量,含甲片,含卸甲</text>
</view>
</view>
<view style="width:100%;display:flex;align-content:center;justify-content:center;margin-top:20rpx">
<text class="z5">须知 需提前两小时预约 周一至周日全天可用 购买后30天内有效 购买前请仔细阅读</text>
</view>
</view>
<view class="time">
<view class="yuyuetext">
<text style="font-weight:bolder;font-size:18px;position:relative;left:30rpx;top:20rpx">预约时间</text>
</view>
<view class="boxtextkuang">
<view class="timebox" a:for="{{ time }}" onTap="selectTime"
data-time="{{item.title}}" style="{{selectedTime === item.title ? 'background-color: #adadad; color: white;' : ''}}">
<text>{{item.title}}</text>
</view>
</view>
<view style="width:100%;height:40px">
<text style="font-weight:bolder;font-size:18px;position:relative;left:30rpx;top:20rpx">指定美甲师</text>
</view>
<view class="miajishikuang">
<view class="meijishsibox" a:for="{{ meijiashi }}" data-index="{{index}}" onTap="onManicuristClick" >
<image class="meijiashiimage" mode="scaleToFill" src="{{item.manicuristAvatar}}" />
<view class="mejiashitext">
<text>{{item.manicuristName}}</text>
</view>
<view style="margin-top:10rpx">
<image a:if="{{item.selected}}" class="duihaoimage" mode="scaleToFill" src="../image/duihao.png" />
</view>
</view>
</view>
</view>
<view class="zhifubox" onTap="zhifu">
<view class="zhifuzhong">
<text style="font-size:18px">立即预约</text>
</view>
</view>

View File

@ -0,0 +1,194 @@
import {url} from '../request'
Page({
data: {
commoditiesImage: '',
commoditiesPrice: '',
commoditiesName: '',
businessId: '',
ids: '',
time: [
{ title: '9:00' },
{ title: '10:00' },
{ title: '11:00' },
{ title: '12:00' },
{ title: '13:00' },
{ title: '14:00' },
{ title: '15:00' },
{ title: '16:00' },
{ title: '17:00' },
],
selectedTime: '',
meijiashi:[],
},
onLoad(options) {
const commoditiesImage = options.commoditiesImage;
const commoditiesName = options.commoditiesName;
const commoditiesPrice = options.commoditiesPrice;
const ids = options.ids;
const businessId = options.businessId;
const dianpuid = options.dianpuid
const businessName = options.businessName
this.setData({
commoditiesImage: commoditiesImage,
commoditiesName: commoditiesName,
commoditiesPrice: commoditiesPrice,
ids: ids,
businessId: businessId,
dianpuid:dianpuid,
businessName:businessName
});
console.log(ids,'shangpinid');
},
// 切换标签
onChange(current) {
this.setData({
current,
});
},
onSwipeChange(e) {
this.setData({
current: e.detail.current,
});
},
onShow(){
this.meijiahsi()
},
jiaru() {
my.getStorage({
key: 'userInfo',
success: (res) => {
const userInfo = res.data;
if (userInfo && userInfo.cookie) {
my.request({
url: url + '/api/cart/add',
method: 'POST',
data: {
businessId: this.data.businessId,
commoditiesId: this.data.ids,
quantity: 1,
selectedOptions: "",
},
headers: {
'content-type': 'application/json',
'Cookie': userInfo.cookie, // 通过头部传递 cookie
},
dataType: 'json',
success: (res) => {
if(res.data.code===0){
console.log(res);
my.alert({ content: '成功添加到购物车' });
}
else if(res.data.code===40100){
my.alert({
content: '登录信息已过期,请重新登录'
});
my.navigateTo({
url:'/pages/denglu/denglu'
})
}
},
fail: (error) => {
console.error('请求失败: ', JSON.stringify(error));
my.alert({ content: '请求失败,请稍后重试' });
},
});
} else {
my.alert({
content: '您未登录,请先登录。',
success: () => {
my.navigateTo({
url: '/pages/denglu/denglu',
});
},
});
}
},
});
},
selectTime(e) {
const selectedTime = e.currentTarget.dataset.time; // 获取点击的时间
console.log(selectedTime);
this.setData({
selectedTime: selectedTime, // 更新选中的时间
});
console.log('选中的时间:', this.data.selectedTime); // 打印选中的时间
},
// 美甲师
meijiahsi(){
my.request({
url: url + '/api/manicurist/userQueryAll',
method: 'GET',
data: {
businessId: this.data.dianpuid
},
headers: {
'content-type': 'application/json',
},
dataType: 'json',
success: (res) => {
console.log('Request succeeded:meijiashi', res);
if (res.data && res.data.data) {
const modifiedData = res.data.data.map(item => {
return {
...item, // 保留原来的属性
selected: false // 添加 selected 属性
};
});
// 更新 data 中的 meijiashi 数据
this.setData({
meijiashi: modifiedData
});
console.log(this.data.meijiashi, '更新后数据');
} else {
console.log('shibaile')
}
},
fail: (error) => {
console.error('Request failed', error);
}
});
},
onManicuristClick(event) {
const index = event.currentTarget.dataset.index;
let meijiashi = this.data.meijiashi;
// 取消所有美甲师的选中状态
meijiashi.forEach((item, i) => {
item.selected = false;
});
// 设置当前点击的美甲师为选中状态
meijiashi[index].selected = true;
// 更新 data 中的 meijiashi
this.setData({
meijiashi: meijiashi
});
this.setData({
meijiashiname:meijiashi[index].manicuristName,
meijiashiid:meijiashi[index].id
})
console.log('当前选中的美甲师:', this.data.meijiashiname,this.data.meijiashiid);
},
zhifu(){
const commoditiesImage = this.data.commoditiesImage;
const commoditiesName = this.data.commoditiesName;
const commoditiesPrice = this.data.commoditiesPrice;
const meijiashiname = this.data.meijiashiname;
const yuyuetime = this.data.selectedTime
const meijiashiid = this.data.meijiashiid
const selectedTime = this.data.selectedTime
const dianpuid = this.data.dianpuid
const businessName = this.data.businessName
const shopid = this.data.ids
my.navigateTo({
url:`/pages/yuyuezhifusm/yuyuezhifusm?commoditiesImage=${commoditiesImage}&&commoditiesName=${commoditiesName}&&commoditiesPrice=${commoditiesPrice}&&meijiashiname=${meijiashiname}&&yuyuetime=${yuyuetime}&&meijiashiid=${meijiashiid}&&selectedTime=${selectedTime}&&dianpuid=${dianpuid}&&businessName=${businessName}&&shopid=${shopid}`
})
}
});

View File

@ -0,0 +1,5 @@
{
"defaultTitle": "预约上门",
"usingComponents": {},
"styleIsolation": "apply-shared"
}

View File

@ -0,0 +1,61 @@
.all{
width: 100%;
display: flex;
justify-content: center;
align-items: center;
flex-direction: column;
}
.box{
width: 90%;
height: 450px;
display: flex;
border: 1px solid #9fa1a3;
border-radius: 20px;
margin-top: 20rpx;
flex-direction: column;
overflow: hidden;
}
.image{
width: 80px;
height: 80px;
border-radius: 10px;
}
.xinxi{
width: 100%;
height: 100px;
display: flex;
margin-left: 20rpx
}
.juzhong{
display:flex;
align-items:center
}
.biaoti{
width: 249px;
margin-left: 10rpx;
}
.text{
font-size: 18px;
font-weight: bold;
}
.form{
width: 100%;
height: 200px;
}
.xian{
width: 100%;
height: 1px;
background-color: #9fa1a3;
}
.zhifu{
display: flex;
justify-content: center;
align-items: center;
width: 90%;
height: 50px;
background-color: #ee8d97;
border-radius: 40px;
position: fixed;
bottom: 40rpx;
}

View File

@ -0,0 +1,66 @@
<view class="all">
<!-- 商品框 -->
<view class="box" >
<view class="xinxi">
<view class="juzhong">
<image class="image" mode="scaleToFill" src="{{commoditiesImage}}" />
</view>
<view class="biaoti">
<view style="margin-top:30rpx">
<text class="text">{{commoditiesName}}</text>
<view style="margin-top:5rpx">
<text>¥{{commoditiesPrice}}</text>
</view>
<view style="margin-top:5rpx">
<text style="color:#898c90">共1件</text>
</view>
</view>
</view>
</view>
<view class="xian"></view>
<view>
<view style="display:flex;justify-content:space-between;margin-top:20rpx">
<text style="font-size:19px;margin-left:30rpx">商品总价</text>
<text style="margin-right:50rpx">¥{{commoditiesPrice}}</text>
</view>
<view class="xian" style="margin-top: 10rpx;"></view>
<view style="display:flex;justify-content:space-between;margin-top:20rpx">
<text style="font-size:19px;margin-left:30rpx">姓名</text>
<input style="width:90px" placeholder="请输入姓名" onInput="name" />
</view>
<view class="xian" style="margin-top: 10rpx;"></view>
<view style="display:flex;justify-content:space-between;margin-top:20rpx">
<text style="font-size:19px;margin-left:30rpx">联系方式</text>
<input style="width:125px" placeholder="请输入联系方式" onInput="phone"/>
</view>
<view class="xian" style="margin-top: 10rpx;"></view>
<view style="display:flex;justify-content:space-between;margin-top:20rpx">
<text style="font-size:19px;margin-left:30rpx">备注</text>
<input style="width:90px" placeholder="备注" onInput="note" />
</view>
<view class="xian" style="margin-top: 10rpx;"></view>
<view style="display:flex;justify-content:space-between;margin-top:20rpx">
<text style="font-size:19px;margin-left:30rpx">蚂蚁积分</text>
<text style="margin-right:30rpx;color:#a3abb2">暂不可用</text>
</view>
<view class="xian" style="margin-top: 10rpx;"></view>
<view style="display:flex;justify-content:space-between;margin-top:20rpx">
<text style="font-size:19px;margin-left:30rpx">预约时间</text>
<text style="margin-right:30rpx;">{{yuyuetime}}</text>
</view>
<view class="xian" style="margin-top: 10rpx;"></view>
<view style="display:flex;justify-content:space-between;margin-top:20rpx">
<text style="font-size:19px;margin-left:30rpx">指定美甲师</text>
<text style="margin-right:30rpx;">{{meijiashiname}}</text>
</view>
<view class="xian" style="margin-top: 10rpx;"></view>
<view style="display:flex;justify-content:right;margin-top:20rpx">
<text style="font-size:19px;">小计</text>
<text style="font-size:19px;color:red;margin-right:20rpx">¥{{commoditiesPrice}}</text>
</view>
</view>
</view>
<view class="zhifu" onTap="zhifu">
<text style="color:white">立即预约</text>
</view>
</view>

View File

@ -0,0 +1,171 @@
import {url} from '../request'
Page({
data: {
},
onLoad(options) {
const commoditiesImage = options.commoditiesImage;
const commoditiesName = options.commoditiesName;
const commoditiesPrice =options.commoditiesPrice
const meijiashiname = options.meijiashiname;
const yuyuetime = options.yuyuetime;
const meijiashiid = options.meijiashiid;
const selectedTime = options.selectedTime; // 例如 "9:00"
const dianpuid = options.dianpuid;
const businessName = options.businessName;
const shopid = options.shopid
// 获取当前日期
const currentDate = new Date();
const year = currentDate.getFullYear();
const month = (currentDate.getMonth() + 1).toString().padStart(2, '0'); // 补充两位
const day = currentDate.getDate().toString().padStart(2, '0'); // 补充两位
// 处理 selectedTime确保格式正确例如 "9:00" 转为 "09:00"
const timeParts = selectedTime.split(':');
const hours = timeParts[0].padStart(2, '0'); // 补充小时
const minutes = timeParts[1].padStart(2, '0'); // 补充分钟
// 拼接日期和时间
const formattedDateTime = `${month}-${day} ${hours}:${minutes}`;
// 设置格式化后的 selectedTime
this.setData({
commoditiesImage: commoditiesImage,
commoditiesName: commoditiesName,
commoditiesPrice: commoditiesPrice,
meijiashiname: meijiashiname,
yuyuetime: yuyuetime,
meijiashiid: meijiashiid,
selectedTime: formattedDateTime, // 存储格式化后的时间
dianpuid: dianpuid,
businessName: businessName,
shopid:shopid
});
},
name(e){
this.setData({
name: e.detail.value,
});
console.log(e.detail.value);
},
phone(e){
this.setData({
phone: e.detail.value,
});
console.log(e.detail.value);
},
zhifu(){
my.getStorage({
key: 'userInfo',
success: (res) => {
const userInfo = res.data;
this.setData({
id: userInfo.id, // 获取 id
});
// 发送请求移除商品
if (userInfo && userInfo.cookie) {
my.request({
url: url + '/api/appointments/add',
method: 'POST',
data: {
appointmentTime: this.data.selectedTime,
businessId: this.data.dianpuid,
businessName: this.data.businessName,
id: "",
manicuristId: this.data.meijiashiid,
manicuristName: this.data.meijiashiname,
notes: "",
payMethod: 0,
phone: this.data.phone,
serviceMode: 0,
userId: userInfo.id,
userName: this.data.name,
},
headers: {
'content-type': 'application/json',
'Cookie': userInfo.cookie
},
dataType: 'json',
success: (res) => {
console.log(res);
if (res.data.code === 0) {
my.alert({content:'预约成功'})
my.navigateBack();
console.log('chenggong');
} else {
my.alert({ content: '失败,请稍后重试' });
console.log(this.data.name,userInfo.id,this.data.phone,this.data.meijiashiname,this.data.meijiashiid,this.data.businessName,this.data.dianpuid,this.data.selectedTime,);
}
},
});
}
},
});
this.add()
},
add(){
my.getStorage({
key: 'userInfo',
success: (res) => {
const userInfo = res.data;
this.setData({
id: userInfo.id, // 获取 id
});
// 发送请求移除商品
if (userInfo && userInfo.cookie) {
my.request({
url: url + '/api/orders/add',
method: 'POST',
data: {
businessId: this.data.dianpuid,
notes:this.data.note,
orderItemsAddRequest: [
{
attributeNames: this.data.commoditiesName,
commoditiesId: this.data.shopid,
quantity: 1
}
],
payMethod: 0,
phone: this.data.phone,
totalPrice: this.data.commoditiesPrice,
userId: this.data.id,
userName: this.data.name
},
headers: {
'content-type': 'application/json',
'Cookie': userInfo.cookie
},
dataType: 'json',
success: (res) => {
console.log(this.data.name,this.data.commoditiesPrice,this.data.phone,this.data.shopid,this.data.commoditiesName,this.data.note,this.data.dianpuid,this.data.id,);
console.log(res,'成功');
if (res.data.code === 0) {
my.showToast({
content: '待商家确认,请稍后',
duration: 2000 // 提示持续时间
});
my.navigateBack();
console.log('chenggong');
} else {
my.alert({ content: '失败,请稍后重试' });
console.log(this.data.name,this.data.commoditiesPrice,this.data.phone,this.data.shopid,this.data.commoditiesName,this.data.note,this.data.dianpuid,'else');
}
},
fail:(res)=>{
console.log(this.data.name,this.data.commoditiesPrice,this.data.phone,this.data.shopid,this.data.commoditiesName,this.data.note,this.data.dianpuid,'失败');
}
});
}
},
});
},
note(e){
this.setData({
note: e.detail.value,
});
console.log(e.detail.value);
}
});

View File

@ -0,0 +1,5 @@
{
"defaultTitle": "到店支付",
"usingComponents": {},
"styleIsolation": "apply-shared"
}

View File

@ -0,0 +1,61 @@
.all{
width: 100%;
display: flex;
justify-content: center;
align-items: center;
flex-direction: column;
}
.box{
width: 90%;
height: 520px;
display: flex;
border: 1px solid #9fa1a3;
border-radius: 20px;
margin-top: 20rpx;
flex-direction: column;
overflow: hidden;
}
.image{
width: 80px;
height: 80px;
border-radius: 10px;
}
.xinxi{
width: 100%;
height: 100px;
display: flex;
margin-left: 20rpx
}
.juzhong{
display:flex;
align-items:center
}
.biaoti{
width: 249px;
margin-left: 10rpx;
}
.text{
font-size: 18px;
font-weight: bold;
}
.form{
width: 100%;
height: 200px;
}
.xian{
width: 100%;
height: 1px;
background-color: #9fa1a3;
}
.zhifu{
display: flex;
justify-content: center;
align-items: center;
width: 90%;
height: 50px;
background-color: #ee8d97;
border-radius: 40px;
position: fixed;
bottom: 40rpx;
}

View File

@ -0,0 +1,76 @@
<view class="all">
<!-- 商品框 -->
<view class="box" >
<view class="xinxi">
<view class="juzhong">
<image class="image" mode="scaleToFill" src="{{commoditiesImage}}" />
</view>
<view class="biaoti">
<view style="margin-top:30rpx">
<text class="text">{{commoditiesName}}</text>
<view style="margin-top:5rpx">
<text>¥{{commoditiesPrice}}</text>
</view>
<view style="margin-top:5rpx">
<text style="color:#898c90">共1件</text>
</view>
</view>
</view>
</view>
<view class="xian"></view>
<view>
<view style="display:flex;justify-content:space-between;margin-top:20rpx">
<text style="font-size:19px;margin-left:30rpx">商品总价</text>
<text style="margin-right:50rpx">¥{{commoditiesPrice}}</text>
</view>
<view class="xian" style="margin-top: 10rpx;"></view>
<view style="display:flex;justify-content:space-between;margin-top:20rpx">
<text style="font-size:19px;margin-left:30rpx">姓名</text>
<input style="width:90px" placeholder="请输入姓名" onInput="name" />
</view>
<view class="xian" style="margin-top: 10rpx;"></view>
<view style="display:flex;justify-content:space-between;margin-top:20rpx">
<text style="font-size:19px;margin-left:30rpx">联系方式</text>
<input style="width:125px" placeholder="请输入联系方式" onInput="phone" />
</view>
<view class="xian" style="margin-top: 10rpx;"></view>
<view style="display:flex;justify-content:space-between;margin-top:20rpx">
<text style="font-size:19px;margin-left:30rpx">地址</text>
<input style="width:125px" placeholder="请输入上门地址" />
</view>
<view class="xian" style="margin-top: 10rpx;"></view>
<view style="display:flex;justify-content:space-between;margin-top:20rpx">
<text style="font-size:19px;margin-left:30rpx">备注</text>
<input style="width:90px" placeholder="备注" onInput="note" />
</view>
<view class="xian" style="margin-top: 10rpx;"></view>
<view style="display:flex;justify-content:space-between;margin-top:20rpx">
<text style="font-size:19px;margin-left:30rpx">蚂蚁积分</text>
<text style="margin-right:30rpx;color:#a3abb2">暂不可用</text>
</view>
<view class="xian" style="margin-top: 10rpx;"></view>
<view style="display:flex;justify-content:space-between;margin-top:20rpx">
<text style="font-size:19px;margin-left:30rpx">预约时间</text>
<text style="margin-right:30rpx;">{{yuyuetime}}</text>
</view>
<view class="xian" style="margin-top: 10rpx;"></view>
<view style="display:flex;justify-content:space-between;margin-top:20rpx">
<text style="font-size:19px;margin-left:30rpx">指定美甲师</text>
<text style="margin-right:30rpx;">{{meijiashiname}}</text>
</view>
<view class="xian" style="margin-top: 10rpx;"></view>
<view style="display:flex;justify-content:space-between;margin-top:20rpx">
<text style="font-size:19px;margin-left:30rpx">上门预约费用</text>
<text style="margin-right:30rpx;">¥{{price}}</text>
</view>
<view class="xian" style="margin-top: 10rpx;"></view>
<view style="display:flex;justify-content:right;margin-top:20rpx">
<text style="font-size:19px;">小计</text>
<text style="font-size:19px;color:red;margin-right:20rpx">¥{{commoditiesPrice}}</text>
</view>
</view>
</view>
<view class="zhifu" onTap="yuyue">
<text style="color:white">立即预约</text>
</view>
</view>

View File

@ -0,0 +1,173 @@
import {url} from '../request'
Page({
data: {
price:50,
},
onLoad(options) {
const commoditiesImage = options.commoditiesImage;
const commoditiesName = options.commoditiesName;
const commoditiesPrice = parseFloat(options.commoditiesPrice) + this.data.price;
const meijiashiname = options.meijiashiname;
const yuyuetime = options.yuyuetime;
const meijiashiid = options.meijiashiid;
const selectedTime = options.selectedTime; // 例如 "9:00"
const dianpuid = options.dianpuid;
const businessName = options.businessName;
const shopid = options.shopid;
// 获取当前日期
const currentDate = new Date();
const year = currentDate.getFullYear();
const month = (currentDate.getMonth() + 1).toString().padStart(2, '0'); // 补充两位
const day = currentDate.getDate().toString().padStart(2, '0'); // 补充两位
// 处理 selectedTime确保格式正确例如 "9:00" 转为 "09:00"
const timeParts = selectedTime.split(':');
const hours = timeParts[0].padStart(2, '0'); // 补充小时
const minutes = timeParts[1].padStart(2, '0'); // 补充分钟
// 拼接日期和时间
const formattedDateTime = `${month}-${day} ${hours}:${minutes}`;
// 设置格式化后的 selectedTime
this.setData({
commoditiesImage: commoditiesImage,
commoditiesName: commoditiesName,
commoditiesPrice: commoditiesPrice,
meijiashiname: meijiashiname,
yuyuetime: yuyuetime,
meijiashiid: meijiashiid,
selectedTime: formattedDateTime, // 存储格式化后的时间
dianpuid: dianpuid,
businessName: businessName,
shopid:shopid
});
},
yuyue(){
my.getStorage({
key: 'userInfo',
success: (res) => {
const userInfo = res.data;
this.setData({
id: userInfo.id, // 获取 id
});
// 发送请求移除商品
if (userInfo && userInfo.cookie) {
my.request({
url: url + '/api/appointments/add',
method: 'POST',
data: {
appointmentTime: this.data.selectedTime,
businessId: this.data.dianpuid,
businessName: this.data.businessName,
id: "",
manicuristId: this.data.meijiashiid,
manicuristName: this.data.meijiashiname,
notes: "",
payMethod: 0,
phone: this.data.phone,
serviceMode: 0,
userId: userInfo.id,
userName: this.data.name,
},
headers: {
'content-type': 'application/json',
'Cookie': userInfo.cookie
},
dataType: 'json',
success: (res) => {
console.log(res);
if (res.data.code === 0) {
my.alert({content:'预约成功'})
my.navigateBack();
console.log('chenggong');
} else {
my.alert({ content: '失败,请稍后重试' });
console.log(this.data.name,userInfo.id,this.data.phone,this.data.meijiashiname,this.data.meijiashiid,this.data.businessName,this.data.dianpuid,this.data.selectedTime,);
}
},
});
}
},
});
this.add()
},
add(){
my.getStorage({
key: 'userInfo',
success: (res) => {
const userInfo = res.data;
this.setData({
id: userInfo.id, // 获取 id
});
// 发送请求移除商品
if (userInfo && userInfo.cookie) {
my.request({
url: url + '/api/orders/add',
method: 'POST',
data: {
businessId: this.data.dianpuid,
notes:this.data.note,
orderItemsAddRequest: [
{
attributeNames: this.data.commoditiesName,
commoditiesId: this.data.shopid,
quantity: 1
}
],
payMethod: 0,
phone: this.data.phone,
totalPrice: this.data.commoditiesPrice,
userId: this.data.id,
userName: this.data.name
},
headers: {
'content-type': 'application/json',
'Cookie': userInfo.cookie
},
dataType: 'json',
success: (res) => {
console.log(this.data.name,this.data.commoditiesPrice,this.data.phone,this.data.shopid,this.data.commoditiesName,this.data.note,this.data.dianpuid,this.data.id,);
console.log(res,'成功');
if (res.data.code === 0) {
my.showToast({
content: '待商家确认,请稍后',
duration: 2000 // 提示持续时间
});
my.navigateBack();
console.log('chenggong');
} else {
my.alert({ content: '失败,请稍后重试' });
console.log(this.data.name,this.data.commoditiesPrice,this.data.phone,this.data.shopid,this.data.commoditiesName,this.data.note,this.data.dianpuid,'else');
}
},
fail:(res)=>{
console.log(this.data.name,this.data.commoditiesPrice,this.data.phone,this.data.shopid,this.data.commoditiesName,this.data.note,this.data.dianpuid,'失败');
}
});
}
},
});
},
name(e){
this.setData({
name: e.detail.value,
});
console.log(e.detail.value);
},
phone(e){
this.setData({
phone: e.detail.value,
});
console.log(e.detail.value);
},
note(e){
this.setData({
note: e.detail.value,
});
console.log(e.detail.value);
}
});

View File

@ -0,0 +1,5 @@
{
"defaultTitle": "上门支付",
"usingComponents": {},
"styleIsolation": "apply-shared"
}