修复了已知问题

This commit is contained in:
Ling53666 2025-01-21 21:56:53 +08:00
parent f1173e3b68
commit cd390fbb08
53 changed files with 1040 additions and 297 deletions

View File

@ -121,8 +121,8 @@
"launchMode": "common"
},
{
"title": "pages/shanmenspjm/shanmenspjm",
"page": "pages/shanmenspjm/shanmenspjm",
"title": "咨询",
"page": "pages/zixunmeijiashi/zixunmeijiashi",
"launchMode": "common"
}
]

View File

@ -27,7 +27,10 @@
"pages/yuyuezhifu/yuyuezhifu",
"pages/shnagmendianpu/shnagmendianpu",
"pages/yuyuezhifusm/yuyuezhifusm",
"pages/yuyuejiemian/yuyuejiemian"
"pages/yuyuejiemian/yuyuejiemian",
"pages/message/message",
"pages/pay/pay",
"pages/dingdanxiangqing/dingdanxiangqing"
],
"window": {
"defaultTitle": "甲情甲意",
@ -47,20 +50,20 @@
{
"pagePath": "pages/shouye/shouye",
"name": "首页",
"icon": "pages/image/shouye.png",
"activeIcon": "pages/image/shouye.png"
"icon": "pages/image/shouyedianjiqian.png",
"activeIcon": "pages/image/shouyedianjihou.png"
},
{
"pagePath": "pages/gouwuche/gouwuche",
"name": "购物车",
"icon": "pages/image/gouwuche.png",
"activeIcon": "pages/image/gouwuche.png"
"icon": "pages/image/gouwuchedianjiqian.png",
"activeIcon": "pages/image/gouwuchedianjihou.png"
},
{
"pagePath": "pages/wode/wode",
"name": "我的",
"icon": "pages/image/my.png",
"activeIcon": "pages/image/my.png"
"icon": "pages/image/wodedianjiqian.png",
"activeIcon": "pages/image/wodedianjihou.png"
}
]
},

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" a:if="{{ item.state==1 }}">
<view class="kuang" a:for="{{ sousuo }}" data-num="{{item}}" onTap="dianpu" a:if="{{ item.storeStatus==1 }}">
<image class="image" mode="scaleToFill" src="{{item.businessAvatar}}" />
<view class="wenzi">
<text class="text">{{item.businessName}}</text>

View File

@ -31,7 +31,7 @@ Page({
onLoad() {
this.localcation();
my.request({
url: url + '/api/business/list',
url: url + '/api/business/listLv',
method: 'POST',
data: {
@ -68,10 +68,16 @@ Page({
const startBusiness = id.startBusiness
const storeStatus = id.storeStatus
const businessPhone =id.businessPhone
console.log('Address being passed: ', ID,address,businessName,businessAvatar,endBusiness,startBusiness,businessPhone);
const level = id.level
console.log('Address being passed: ', level,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/dianpuzhuye/dianpuzhuye?userId=${userId}
&&address=${address}&&businessName=${businessName}
&&businessAvatar=${businessAvatar}
&&startBusiness=${startBusiness}
&&endBusiness=${endBusiness}&&storeStatus=${storeStatus}
&&id=${ID}&&businessPhone=${businessPhone}&&level=${level}`,
});
},
find(){

View File

@ -3,24 +3,27 @@ Page({
data: {
authCode: '',
intervalId: null, // 定时器ID用于后续清除
sid:0
},
Login() {
my.getAuthCode({
scopes: 'auth_user',
success: res => {
const authCode = res.authCode;
console.log(typeof authCode);
console.log(authCode);
const authcode = res.authCode;
console.log(typeof authcode);
console.log(authcode);
// 请求后端接口进行用户登录
my.request({
url: url + '/api/Alipay/parseCode',
data: {
authCode,
authcode,
severId:this.data.sid
},
success: (res) => {
const { username, avatarUrl, id } = res.data.data;
if(res.data.code==0){
const { username, avatarUrl, id } = res.data.data;
const setCookie = res.header['set-cookie'] || res.header['Set-Cookie'];
console.log('Set-Cookie:', setCookie + '这是这个码');
@ -51,6 +54,11 @@ Page({
title: '登录成功',
});
my.navigateBack();
}else{
this.setData({
sid:1,
})
}
},
fail: (res) => {
console.log("登录失败:", res);

View File

@ -4,14 +4,17 @@
<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>
<ant-rate
defaultValue="{{level}}"
readonly
></ant-rate>
<text class="z3">{{level}}.0</text>
<text class="z4">500条</text>
</view>
<view onTap="soucang">
<image class="soucangimage" mode="scaleToFill" src="../image/shoucang.png" />
</view>
<view>
<view onTap="kefu">
<image class="zixunimage" mode="scaleToFill" src="../image/zixun.png" />
</view>
</view>

View File

@ -43,6 +43,7 @@ Page({
showComments: false, // 控制评论部分是否显示
showBusinessInfo: false, // 控制商家信息是否显示
pingjia:[],
level:''
},
onLoad(options) {
// Extract userId and address from options
@ -55,6 +56,7 @@ Page({
const storeStatus = options.storeStatus;
const id = options.id
const businessPhone = options.businessPhone
const level = options.level
console.log(id,'这是店铺id吗');
// Set them in data for use in the page
this.setData({
@ -67,6 +69,7 @@ Page({
storeStatus:storeStatus,
id:id,
businessPhone:businessPhone,
level:level
});
my.request({
url: url + '/api/commodities/list/page/commodities',
@ -270,6 +273,7 @@ jiaru(item) {
console.log('传递的数据:', id);
const ids = id.id
const businessId = id.businessId
const selectedOptions = '到店服务'
my.getStorage({
key: 'userInfo',
success: (res) => {
@ -283,7 +287,7 @@ jiaru(item) {
businessId: businessId,
commoditiesId: ids,
quantity: 1,
selectedOptions: "",
selectedOptions: selectedOptions,
userId: userInfo.id
},
headers: {
@ -341,4 +345,9 @@ shangpinjiemian(item){
})
console.log(ids,businessId,commoditiesImage,commoditiesName,commoditiesPrice+'这是商品的',dianpuid+'这是店铺的')
},
kefu(){
my.navigateTo({
url:'/pages/zixunmeijiashi/zixunmeijiashi'
})
}
});

View File

@ -1,6 +1,8 @@
{
"defaultTitle": "店铺主页",
"usingComponents": {},
"usingComponents": {
"ant-rate": "antd-mini/es/Rate/index"
},
"styleIsolation": "apply-shared"
}

View File

@ -0,0 +1,63 @@
.text{
font-size: 18px;
font-weight:bold;
}
.textbox{
width: 40%;
height: 50px;
display: flex;
justify-content: center;
align-items: center;
}
.box{
width: 90%;
display: flex;
flex-direction: column;
border: 1px solid #f69595;
border-radius: 10px;
}
.image{
width: 25px;
height: 25px;
}
.biaoti{
width: 100%;
display: flex;
height: 30px;
align-items:center;
justify-content:space-between;
}
.imagebox{
display: flex;
margin:10rpx 0 20rpx 0
}
.dindan{
display: flex;
justify-content: center;
}
.tupian{
width: 100px;
height: 100px;
border-radius: 20px;
margin-left: 20rpx;
}
.price{
width: 70px;
display: flex;
align-items:flex-end;
justify-content: center;
margin-left:auto ;
}
.xian{
width: 98%;
height: 1px;
border-top: 1px solid #827e7e;
}
.messagebox{
width: 100%;
display: flex;
flex-direction: column;
}
.textwiezhi{
margin:10rpx 0 10rpx 20rpx
}

View File

@ -0,0 +1,40 @@
<view class="textbox">
<text a:if="{{ statues==0 }}" class="text">订单待支付</text>
<text a:if="{{ statues==1 }}" class="text">订单待使用</text>
<text a:if="{{ statues==2 }}" class="text">订单已完成</text>
<text a:if="{{ statues==3 }}" class="text">订单已取消</text>
<text a:if="{{ statues==4 }}" class="text">订单已预约</text>
<text a:if="{{ statues==5 }}" class="text">订单已退款</text>
</view>
<view class="dindan">
<view class="box">
<view class="biaoti">
<view style="margin-left:10rpx;display:flex;justify-content:center;align-items:center">
<text>{{businessName}}</text>
<image class="image" mode="scaleToFill" src="../image/jiantou.png" />
</view>
<view>
<text style="color:#95c1f6;margin-right:10rpx">到店服务</text>
</view>
</view>
<!-- 图片部分 -->
<view class="imagebox">
<image class="tupian" mode="scaleToFill" src="{{commoditiesImage}}" />
<view style="display:flex;flex-direction:column;height:100%;justify-content:center">
<text style="margin-left:20rpx;font-weight:bold;font-size:18">{{commoditiesName}}</text>
<text style="margin:10rpx 0 0 20rpx">x1</text>
</view>
<view class="price">
<text>实付¥{{commoditiesPrice}}</text>
</view>
</view>
<view class="xian"></view>
<!-- 信息部分 -->
<view class="messagebox">
<text class="textwiezhi">订单编号:{{ordernumber}}</text>
<text class="textwiezhi">客户姓名:{{userName}}</text>
<text class="textwiezhi">联系电话:{{phone}}</text>
<text class="textwiezhi">下单时间:{{createTime}}</text>
</view>
</view>
</view>

View File

@ -0,0 +1,25 @@
Page({
data: {},
onLoad(options) {
const ordernumber = options.ordernumber
const userName = options.userName
const phone = options.phone
const createTime = options.createTime
const commoditiesPrice = options.commoditiesPrice
const commoditiesImage = options.commoditiesImage
const commoditiesName = options.commoditiesName
const businessName = options.businessName
const statues = options.statues
console.log(statues,ordernumber,userName,phone,createTime,businessName,commoditiesPrice,commoditiesImage,commoditiesName);
this.setData({
userName:userName,
phone:phone,
createTime:createTime,
commoditiesPrice:commoditiesPrice,
commoditiesImage:commoditiesImage,
commoditiesName:commoditiesName,
businessName:businessName,
statues:statues
})
},
});

View File

@ -0,0 +1,5 @@
{
"defaultTitle": "订单详情",
"usingComponents": {},
"styleIsolation": "apply-shared"
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.5 KiB

View File

@ -234,7 +234,7 @@ onUpload(file) {
this.setData({
zhengshu:cunchu.data,
})
console.log(this.data.yingyeimage,'hhhhhhhhhhhhhhh');
console.log(this.data.zhengshu,'hhhhhhhhhhhhhhh');
},
fail: (err) => {
console.log('上传失败:', err);
@ -243,4 +243,5 @@ onUpload(file) {
});
});
},
});

View File

@ -0,0 +1,27 @@
.image{
width: 50px;
height: 50px;
border-radius: 40px;
}
.textbox{
width: 100%;
border-bottom: 1px solid #8f8585;
display: flex;
justify-content: space-between;
}
.imagebox{
width: 80%;
display: flex;
}
.name{
display: flex;
flex-direction: column;
margin-left: 10rpx;
}
.time{
width: 20%;
height: 50px;
display: flex;
justify-content: center;
align-items: center;
}

View File

@ -0,0 +1,14 @@
<view>
<view class="textbox" a:for="{{ message }}">
<view class="imagebox">
<image class="image" mode="scaleToFill" src="https://tse4-mm.cn.bing.net/th/id/OIP-C.Uoz1-5uTFTJ7s8fymTUhYgAAAA?w=181&h=191&c=7&r=0&o=5&dpr=1.3&pid=1.7" />
<view class="name">
<text>{{item.name}}</text>
<text>{{item.text}}</text>
</view>
</view>
<view class="time">
<text>{{item.time}}</text>
</view>
</view>
</view>

View File

@ -0,0 +1,27 @@
Page({
data: {
message:[
{
name:'美美美甲店',
text:'kjashljashdlkashdlksahl'
},
{
name:'美美美甲店',
text:'kjashljashdlkashdlksahl'
},
{
name:'美美美甲店',
text:'kjashljashdlkashdlksahl'
},
{
name:'美美美甲店',
text:'kjashljashdlkashdlksahl'
},
{
name:'美美美甲店',
text:'kjashljashdlkashdlksahl'
},
]
},
onLoad() {},
});

View File

@ -0,0 +1,4 @@
{
"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: 180px;
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,37 @@
<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">共{{quantity}}件</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>
<text style="margin-right:30rpx;color:#a3abb2">暂不可用</text>
</view>
<text></text>
</view>
</view>
<view class="zhifu" onTap="paymoney">
<text style="color:white">支付 ¥{{commoditiesPrice}}</text>
</view>
</view>

View File

@ -0,0 +1,68 @@
import {url} from '../request'
Page({
data:{
},
onLoad(options) {
const commoditiesImage = options.commoditiesImage
const commoditiesName = options.commoditiesName
const commoditiesPrice = options.commoditiesPrice
const quantity = options.quantity
const orderNumber = options.ordernumber
console.log(orderNumber,quantity,commoditiesPrice,commoditiesName,commoditiesImage);
this.setData({
orderNumber:orderNumber,
commoditiesImage:commoditiesImage,
quantity:quantity,
commoditiesPrice:commoditiesPrice,
commoditiesName:commoditiesName,
})
},
paymoney(){
console.log(this.data.orderNumber);
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/Alipay/create/alipay',
method: 'GET',
data: {
orderNumber: this.data.orderNumber
},
headers: {
'content-type': 'application/json',
},
dataType: 'json',
success: (res) => {
console.log(res);
if (res.data.code === 0) {
console.log(res);
my.alert({content:'支付成功'})
my.navigateBack();
}
},
fail: (error) => {
my.alert({ content: '支付失败' });
},
});
} else {
my.alert({
content: '您未登录,请先登录。',
success: () => {
my.navigateTo({
url: '/pages/denglu/denglu',
});
},
});
}
},
});
}
});

View File

@ -0,0 +1,4 @@
{
"usingComponents": {},
"styleIsolation": "apply-shared"
}

View File

@ -1,7 +1,6 @@
/* 评价盒子 */
.box {
width: 90%;
height: 150px;
border: 1px solid #de868f;
border-radius: 20rpx;
margin-top: 20rpx;
@ -48,4 +47,14 @@ justify-content: space-between
display:flex;
flex-direction: column;
align-items: center
}
.label {
color: #333;
}
.input-row {
display: flex;
flex-direction: column;
padding: 10px 0;
border-bottom: 1px solid #ddd;
margin-left: 20rpx;
}

View File

@ -32,7 +32,8 @@
<view style="margin-left:40rpx;margin-bottom:20rpx;width:300px">
<text style="margin-right:10rpx">总体</text>
<ant-rate
defaultValue="{{3.5}}"
onChange="handleChangem"
defaultValue="{{0}}"
>
<ant-icon
slot="character"
@ -42,6 +43,9 @@
</view>
<!-- 店铺商品 -->
</view>
<view style="margin-bottom:10rpx">
<textarea onBlur="bindTextAreaBlur" auto-height placeholder="告诉美甲师,激励我们做的更好" />
</view>
</view>
<view class="box">
<!-- 标题栏 -->
@ -62,7 +66,8 @@
<view style="margin-left:40rpx;margin-bottom:20rpx;width:300px">
<text style="margin-right:10rpx">总体</text>
<ant-rate
defaultValue="{{3.5}}"
defaultValue="{{0}}"
onChange="handleChange"
>
<ant-icon
slot="character"
@ -71,7 +76,21 @@
</ant-rate>
</view>
</view>
<view style="margin-bottom:10rpx">
<textarea onInput="bindTextAreaBlur" auto-height placeholder="说说商品怎么样,给大家参考" />
</view>
<view class="section">
<view class="input-row">
<ant-uploader
onChange="onChange"
onUpload="{{onUpload ? onUpload : 'onUpload'}}"
uploadingText="上传中……"
uploadfailedText="上传失败"
></ant-uploader>
<text class="label">上传图片</text>
</view>
</view>
</view>
<view class="button" onTap="ruzhu">提交</view>
<view class="button" onTap="tijiao">提交</view>
</view>
</view>

View File

@ -1,7 +1,107 @@
import {url} from '../request'
Page({
data: {},
data: {
},
onLoad() {},
onChange(value, e) {
console.log(value, e);
},
bindTextAreaBlur(e) {
this.setData({
inputtext:e.detail.value
})
console.log(this.data.inputtext);
},
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.zhengshu,'hhhhhhhhhhhhhhh');
},
fail: (err) => {
console.log('上传失败:', err);
reject();
},
});
});
},
// 星级改变
handleChange(value) {
console.log(value);
this.setData({
value:value,
});
},
handleChangem(value) {
console.log(value);
this.setData({
valuemeijiashi:value,
});
},
tijiao(){
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/level/add',
method: 'POST',
data: {
businessId: 0,
manicuristId: 0,
manicuristRating: this.data.valuemeijiashi,
orderId: 0,
rating: this.data.value,
review: this.data.inputtext,
userId: this.data.id
},
headers: {
'content-type': 'application/json',
},
dataType: 'json',
success: (res) => {
console.log(res);
if (res.data.code === 0) {
console.log(res);
my.alert({content:'评价成功'})
my.navigateBack();
}
},
fail: (error) => {
my.alert({ content: '评价失败' });
},
});
} else {
my.alert({
content: '您未登录,请先登录。',
success: () => {
my.navigateTo({
url: '/pages/denglu/denglu',
});
},
});
}
},
});
},
});

View File

@ -4,6 +4,7 @@
"ant-checkbox": "antd-mini/es/Checkbox/index",
"ant-rate": "antd-mini/es/Rate/index",
"ant-icon": "antd-mini/es/Icon/index",
"ant-uploader": "antd-mini/es/ImageUpload/index",
"ant-notice": "antd-mini/es/NoticeBar/index"
},
"styleIsolation": "apply-shared"

View File

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

View File

@ -29,7 +29,7 @@ Page({
},
chaxun(){
my.request({
url: url + '/api/business/list',
url: url + '/api/business/listLv',
method: 'POST',
data: {
@ -44,6 +44,7 @@ Page({
this.setData({
xuanran: res.data.data, // 更新 tuijian 列表
});
console.log(this.data.xuanran,'askjdsakldlasjdl');
} else {
console.log('shibaile')
}
@ -103,10 +104,15 @@ Page({
const startBusiness = id.startBusiness
const storeStatus = id.storeStatus
const businessPhone =id.businessPhone
console.log('Address being passed: ', ID,address,businessName,businessAvatar,endBusiness,startBusiness,businessPhone);
const level =id.level
console.log('Address being passed: ',level, ID,address,businessName,businessAvatar,endBusiness,startBusiness,businessPhone);
my.navigateTo({
url: `/pages/shnagmendianpu/shnagmendianpu?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}&&level=${level}`,
});
},
onChange(e) {

View File

@ -4,14 +4,17 @@
<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>
<ant-rate
defaultValue="{{level}}"
readonly
></ant-rate>
<text class="z3">{{level}}.0</text>
<text class="z4">500条</text>
</view>
<view onTap="soucang">
<image class="soucangimage" mode="scaleToFill" src="../image/shoucang.png" />
</view>
<view>
<view onTap="zixun">
<image class="zixunimage" mode="scaleToFill" src="../image/zixun.png" />
</view>
</view>

View File

@ -43,6 +43,8 @@ Page({
showComments: false, // 控制评论部分是否显示
showBusinessInfo: false, // 控制商家信息是否显示
pingjia:[],
selectedOptions:'0',
level:''
},
onLoad(options) {
// Extract userId and address from options
@ -55,6 +57,7 @@ Page({
const storeStatus = options.storeStatus;
const id = options.id
const businessPhone = options.businessPhone
const level = options.level
console.log(id,'这是店铺id吗');
// Set them in data for use in the page
this.setData({
@ -67,6 +70,7 @@ Page({
storeStatus:storeStatus,
id:id,
businessPhone:businessPhone,
level:level
});
my.request({
url: url + '/api/commodities/list/page/commodities',
@ -282,7 +286,7 @@ jiaru(item) {
businessId: businessId,
commoditiesId: ids,
quantity: 1,
selectedOptions: "",
selectedOptions: selectedOptions,
userId: userInfo.id
},
headers: {
@ -340,4 +344,9 @@ shangpinjiemian(item){
})
console.log(ids,businessId,commoditiesImage,commoditiesName,commoditiesPrice+'这是商品的',dianpuid+'这是店铺的')
},
kefu(){
my.navigateTo({
url:'/pages/zixunmeijiashi/zixunmeijiashi'
})
}
});

View File

@ -1,5 +1,7 @@
{
"defaultTitle": "店铺主页",
"usingComponents": {},
"usingComponents": {
"ant-rate": "antd-mini/es/Rate/index"
},
"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}}" a:if="{{ item.state==1 }}" data-num="{{item}}" onTap="dianpu">
<view class="kuang" a:for="{{ tuijian }}" a:key="{{index}}" a:if="{{ item.storeStatus==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

@ -29,9 +29,9 @@ Page({
updateTime: "",
userId: 0
},
onLoad() {
onShow() {
my.request({
url: url + '/api/business/list',
url: url + '/api/business/listLv',
method: 'POST',
data: {
@ -68,10 +68,15 @@ Page({
const startBusiness = id.startBusiness
const storeStatus = id.storeStatus
const businessPhone =id.businessPhone
console.log('Address being passed: ', ID,address,businessName,businessAvatar,endBusiness,startBusiness,businessPhone);
const level = id.level
console.log('Address being passed: ',level, 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/dianpuzhuye/dianpuzhuye?userId=${userId}
&&address=${address}&&businessName=${businessName}
&&businessAvatar=${businessAvatar}&&startBusiness=${startBusiness}
&&endBusiness=${endBusiness}&&storeStatus=${storeStatus}
&&id=${ID}&&businessPhone=${businessPhone}&&level=${level}`,
});
},
shangmen(){

View File

@ -39,13 +39,16 @@
}
.z1{
font-size: 20px;
position: relative;
margin-left: 20rpx;
}
.image1{
max-width: 30px;
max-height: 30px;
position:relative;
margin-left: 35rpx;
}
.imagejian{
max-width: 30px;
max-height: 30px;
}
/* 退出登录 */
.box10 image{
@ -71,4 +74,12 @@
.box3{
width: 100%;
height: 100rpx;
display: flex;
align-items: center;
justify-content: space-between;
}
.fenbu{
width: 90%;
display: flex;
align-items: center;
}

View File

@ -8,40 +8,60 @@
<!-- 信息盒子 -->
<!--我的订单 -->
<view style="width:100%">
<view class="box3" onTap="message">
<view class="fenbu">
<image class="image1" mode="aspectFill" src="/pages/image/message.png"></image>
<text class="z1">我的消息</text>
</view>
<image class="imagejian" mode="aspectFill" src="/pages/image/jiantou.png"></image>
</view>
<!-- 我的订单 -->
<view class="box3" onTap="dingdan">
<image class="image1"style="left:40rpx;top:25rpx" mode="aspectFill" src="/pages/image/wodedingdan.png"></image>
<image class="image1" style="top:23rpx;left:600rpx;" mode="aspectFill" src="/pages/image/jiantou.png"></image>
<text class="z1" style="top:18rpx">我的订单</text>
<view class="fenbu">
<image class="image1" mode="aspectFill" src="/pages/image/wodedingdan.png"></image>
<text class="z1">我的订单</text>
</view>
<image class="imagejian" mode="aspectFill" src="/pages/image/jiantou.png"></image>
</view>
<!-- 我的评价-->
<!-- 我的评价-->
<view class="box3" onTap="pingjia">
<image class="image1"style="left:40rpx;top:25rpx" mode="aspectFill" src="/pages/image/wodepingjia.png"></image>
<image class="image1" style="top:23rpx;left:600rpx;" mode="aspectFill" src="/pages/image/jiantou.png"></image>
<text class="z1" style="top:18rpx">我的评价</text>
<view class="fenbu">
<image class="image1" mode="aspectFill" src="/pages/image/wodepingjia.png"></image>
<text class="z1">我的评价</text>
</view>
<image class="imagejian" mode="aspectFill" src="/pages/image/jiantou.png"></image>
</view>
<!-- 我的收藏 -->
<view class="box3" onTap="shoucang">
<image class="image1"style="left:40rpx;top:25rpx" mode="aspectFill" src="/pages/image/shoucang.png"></image>
<image class="image1" style="top:23rpx;left:600rpx;" mode="aspectFill" src="/pages/image/jiantou.png"></image>
<text class="z1" style="top:18rpx">我的收藏</text>
<!-- 我的收藏 -->
<view class="box3" onTap="shoucang">
<view class="fenbu">
<image class="image1" mode="aspectFill" src="/pages/image/shoucang.png"></image>
<text class="z1">我的收藏</text>
</view>
<image class="imagejian" mode="aspectFill" src="/pages/image/jiantou.png"></image>
</view>
<!-- 商家入驻 -->
<view class="box3" onTap="ruzhu">
<image class="image1"style="left:40rpx;top:25rpx" mode="aspectFill" src="/pages/image/shangjiaruzu.png"></image>
<image class="image1" style="top:23rpx;left:600rpx;" mode="aspectFill" src="/pages/image/jiantou.png"></image>
<text class="z1" style="top:18rpx">商家入驻</text>
<view class="fenbu">
<image class="image1" mode="aspectFill" src="/pages/image/shangjiaruzu.png"></image>
<text class="z1">商家入驻</text>
</view>
<image class="imagejian" mode="aspectFill" src="/pages/image/jiantou.png"></image>
</view>
<!-- 认证美甲师 -->
<view class="box3" onTap="meijishi" >
<image class="image1"style="left:40rpx;top:25rpx" mode="aspectFill" src="/pages/image/meijishirenzheng.png"></image>
<image class="image1" style="top:23rpx;left:600rpx;" mode="aspectFill" src="/pages/image/jiantou.png"></image>
<text class="z1" style="top:18rpx">认证美甲师</text>
<view class="box3" onTap="meijishi">
<view class="fenbu">
<image class="image1" mode="aspectFill" src="/pages/image/meijishirenzheng.png"></image>
<text class="z1">认证美甲师</text>
</view>
<image class="imagejian" mode="aspectFill" src="/pages/image/jiantou.png"></image>
</view>
<!-- 退出登录 -->
<view class="box3" onTap="out">
<image class="image1"style="left:40rpx;top:25rpx" mode="aspectFill" src="/pages/image/tuichudenglu.png"></image>
<image class="image1" style="top:23rpx;left:600rpx;" mode="aspectFill" src="/pages/image/jiantou.png"></image>
<text class="z1" style="top:18rpx">退出登录</text>
<view class="fenbu">
<image class="image1" mode="aspectFill" src="/pages/image/tuichudenglu.png"></image>
<text class="z1">退出登录</text>
</view>
<image class="imagejian" mode="aspectFill" src="/pages/image/jiantou.png"></image>
</view>
</view>

View File

@ -56,7 +56,13 @@ Page({
url: '/pages/shangjiaruzhu/shangjiaruzhu'
});
},
message() {
my.navigateTo({
url: '/pages/message/message'
});
},
login() {
console.log(this.data.messagelogin);
if (!this.data.messagelogin) {
my.navigateTo({
url: '/pages/denglu/denglu'
@ -84,6 +90,7 @@ Page({
this.setData({
username: '请登录',
avatarUrl: 'https://tse2-mm.cn.bing.net/th/id/OIP-C.jHUH4s7TQ48X_B-1iozuJgHaHa?w=207&h=207&c=7&r=0&o=5&dpr=1.5&pid=1.7',
messagelogin:""
});
my.alert({
content:'您已退出登录'

View File

@ -20,7 +20,7 @@
<swiper-item>
<view class="box" >
<!-- 最外层盒子 -->
<view class="box1" a:for="{{dingdan}}">
<view class="box1" a:for="{{dingdan}}" onTap="xiangqing" data-num="{{item}}" >
<!-- 粉色框 -->
<view class="biaoti">
<!-- 标题栏 -->
@ -34,6 +34,8 @@
<text a:elif="{{item.paymentStatus == 1}}">待使用</text>
<text a:elif="{{item.paymentStatus == 2}}">已完成</text>
<text a:elif="{{item.paymentStatus == 3}}">已取消</text>
<text a:elif="{{item.paymentStatus == 4}}">预约</text>
<text a:elif="{{item.paymentStatus == 5}}">退款</text>
</view>
</view>
<!-- 图片 -->
@ -53,7 +55,7 @@
<swiper-item>
<view class="box" >
<!-- 最外层盒子 -->
<view class="box1" a:for="{{dingdan}}" a:if="{{item.paymentStatus == 0}}">
<view class="box1" onTap="xiangqing" a:for="{{dingdan}}" a:if="{{item.paymentStatus == 0}}">
<!-- 粉色框 -->
<view class="biaoti">
<!-- 标题栏 -->
@ -73,10 +75,10 @@
<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 onTap="quxiao" data-id="{{item.id}}">
<view onTap="quxiao" data-id="{{item.orderId}}">
<text class="textcss">取消</text>
</view>
<view>
<view onTap="pay"data-num="{{item}}">
<text class="textcss">支付</text>
</view>
</view>
@ -84,6 +86,7 @@
<view style="width:240px">
<text class="text"style="left:190rpx;bottom:80rpx;font-size:15px">剩余20:34</text>
</view>
</view>
</view>
</swiper-item>
@ -91,7 +94,7 @@
<swiper-item>
<view class="box" >
<!-- 最外层盒子 -->
<view class="box1" a:for="{{dingdan}}" a:if="{{ item.paymentStatus==1 }}">
<view class="box1" onTap="xiangqing" data-num="{{item}}" a:for="{{dingdan}}" a:if="{{ item.paymentStatus==1 }}">
<!-- 粉色框 -->
<view class="biaoti">
<!-- 标题栏 -->
@ -129,7 +132,7 @@
<swiper-item>
<view class="box" >
<!-- 最外层盒子 -->
<view class="box1" a:for="{{dingdan}}" a:if="{{ item.paymentStatus==2 }}">
<view class="box1" onTap="xiangqing" data-num="{{item}}" a:for="{{dingdan}}" a:if="{{ item.paymentStatus==2 }}">
<!-- 粉色框 -->
<view class="biaoti">
<!-- 标题栏 -->
@ -159,7 +162,7 @@
<swiper-item>
<view class="box" >
<!-- 最外层盒子 -->
<view class="box1" a:for="{{dingdan}}" a:if="{{ item.paymentStatus==3 }}">
<view class="box1" onTap="xiangqing" data-num="{{item}}" a:for="{{dingdan}}" a:if="{{ item.paymentStatus==3 }}">
<!-- 粉色框 -->
<view class="biaoti">
<!-- 标题栏 -->
@ -185,11 +188,41 @@
</view>
</view>
</swiper-item>
<!-- 预约 -->
<swiper-item>
<view class="box" >
<!-- 最外层盒子 -->
<view class="box1" onTap="xiangqing" data-num="{{item}}" a:for="{{dingdan}}" a:if="{{ item.paymentStatus==0 }}">
<!-- 粉色框 -->
<view class="biaoti">
<!-- 标题栏 -->
<view class="biaoti1">
<image mode="scaleToFill" class="image" src="{{item.businessVO.businessAvatar}}" />
<text style="margin-left:10rpx;font-weight:bolder">{{item.businessVO.businessName}}</text>
<image class="image1" mode="scaleToFill" src="/pages/image/jiantou.png" />
</view>
<view style="margin-right:20rpx">
<text >预约中</text>
</view>
</view>
<!-- 图片 -->
<view a:for="{{ item.orderItemsVOList }}">
<image mode="scaleToFill" class="image2" src="{{item.commoditiesVO.commoditiesImage}}" />
<text class="text"style="left:10rpx;bottom:120rpx">{{item.commoditiesVO.commoditiesName}}</text>
<text class="text" style="bottom:70rpx;right:180rpx;color:#377ff3">到店服务</text>
<text class="text"style="bottom:100rpx;left:80rpx;font-size:18px">¥{{item.commoditiesVO.commoditiesPrice}}</text>
</view>
<view style="width:240px">
<text class="text"style="left:190rpx;bottom:50rpx;font-size:12px">地址:{{item.businessVO.address}}</text>
</view>
</view>
</view>
</swiper-item>
<!-- 退款 -->
<swiper-item>
<view class="box" >
<!-- 最外层盒子 -->
<view class="box1" a:for="{{dingdan}}" a:if="{{ item.paymentStatus==3 }}">
<view class="box1" onTap="xiangqing" data-num="{{item}}" a:for="{{dingdan}}" a:if="{{ item.paymentStatus==3 }}">
<!-- 粉色框 -->
<view class="biaoti">
<!-- 标题栏 -->

View File

@ -19,6 +19,9 @@ Page({
{
title: '已取消',
},
{
title: '预约',
},
{
title: '退款',
},
@ -33,7 +36,7 @@ Page({
]
},
onShow(){
onShow() {
my.getStorage({
key: 'userInfo',
success: (res) => {
@ -41,7 +44,7 @@ Page({
this.setData({
id: userInfo.id, // 获取 id
});
if (userInfo && userInfo.cookie) {
my.request({
url: url + '/api/orders/my/page',
@ -51,7 +54,7 @@ Page({
current: 1,
endTime: "",
id: "",
pageSize: 10,
pageSize: 1000,
paymentStatus: "",
sortField: "",
sortOrder: "",
@ -65,19 +68,28 @@ Page({
},
dataType: 'json',
success: (res) => {
if(res.data.code===0){
if (res.data.code === 0) {
// 在成功返回数据后,修改数据结构
const updatedDingdan = res.data.data.records.map(item => {
// 遍历 orderItemsVOList为每个商品添加 orderNumber
item.orderItemsVOList = item.orderItemsVOList.map(orderItem => {
orderItem.commoditiesVO.orderNumber = item.orderNumber; // 添加 orderNumber
return orderItem;
});
return item;
});
// 更新数据到页面
this.setData({
dingdan:res.data.data.records,
})
}
else if(res.data.code===40100){
dingdan: updatedDingdan,
});
} else if (res.data.code === 40100) {
my.alert({
content: '登录信息已过期,请重新登录'
content: '登录信息已过期,请重新登录',
});
my.navigateTo({
url:'/pages/denglu/denglu'
})
url: '/pages/denglu/denglu',
});
}
console.log(res);
console.log(this.data.dingdan);
@ -87,8 +99,7 @@ Page({
my.alert({ content: '请求失败,请稍后重试' });
},
});
}
else {
} else {
my.alert({
content: '您未登录,请先登录。',
success: () => {
@ -101,6 +112,7 @@ Page({
},
});
},
onSwipeChange(e) {
this.setData({
current: e.detail.current,
@ -144,7 +156,8 @@ quxiao(e){
url: url + '/api/orders/cancel',
method: 'POST',
data: {
"id": 0
id:orderId,
userId: this.data.id
},
headers: {
'content-type': 'application/json',
@ -156,7 +169,7 @@ quxiao(e){
my.showToast({
content: '订单已取消',
});
this.fetchOrders()
this.onShow()
}
else if(res.data.code===40100){
my.alert({
@ -187,49 +200,45 @@ quxiao(e){
}
},
});
console.log(orderId,this.data.id);
},
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: '请求失败,请稍后重试' });
},
});
}
},
});
pay(item){
const id = item.target.dataset.num
const ordernumber = id.commoditiesVO.orderNumber
const commoditiesName = id.commoditiesVO.commoditiesName
const commoditiesPrice = id.commoditiesVO.commoditiesPrice
const quantity =id.quantity
const commoditiesImage =id.commoditiesVO.commoditiesImage
console.log(id,ordernumber,commoditiesName,commoditiesPrice);
my.navigateTo({
url:`/pages/pay/pay?ordernumber=${ordernumber}
&&commoditiesName=${commoditiesName}
&&commoditiesPrice=${commoditiesPrice}
&&quantity=${quantity}&&commoditiesImage=${commoditiesImage}`
})
},
xiangqing(item){
const id = item.target.dataset.num
console.log(id);
const message = id.orderItemsVOList
const ordernumber = id.orderNumber
const createTime = id.createTime
const phone = id.phone
const userName = id.userName
const businessName =id.businessVO.businessName
const commoditiesName = message[0].commoditiesVO.commoditiesName;
const commoditiesImage = message[0].commoditiesVO.commoditiesImage;
const commoditiesPrice = message[0].commoditiesVO.commoditiesPrice;
const businessId = id.businessVO.id
const statues =id.paymentStatus
console.log(statues,businessId,commoditiesPrice,commoditiesImage,commoditiesName,message,ordernumber,createTime,phone,userName,businessName);
my.navigateTo({
url:`/pages/dingdanxiangqing/dingdanxiangqing?ordernumber=${ordernumber}
&&createTime=${createTime}&&phone=${phone}&&userName=${userName}
&&businessName=${businessName}&&commoditiesName=${commoditiesName}&&commoditiesImage=${commoditiesImage}
&&commoditiesPrice=${commoditiesPrice}&&businessId=${businessId}
&&statues=${statues}`
})
}
});

View File

@ -22,7 +22,6 @@ page{
overflow:hidden;
}
.container{
color: #333333;
border-radius: 10px;
height: 150px;
@ -113,3 +112,15 @@ page{
bottom: 70rpx;
margin-right: 10rpx;
}
.message{
width: 65%;
height: 80px;
position: relative;
top: 40rpx;
left: 50rpx;
}
.messagebox{
display: flex;
width: 100%;
height: 110px;
}

View File

@ -18,16 +18,21 @@
a:key="{{ index }}">
<!-- 全部-->
<swiper-item class="swiper-item">
<view class="containercontent" a:for="{{ dingdan }}"a:key="index">
<view class="containercontent" a:for="{{ message }}"a:key="index">
<view style="height:190px">
<view style="display:flex">
<image class="image" mode="scaleToFill" src="{{item.image}}" />
<image class="image" mode="scaleToFill" src="https://c-ssl.dtstatic.com/uploads/blog/202305/08/20230508112951_78480.thumb.400_0.jpeg" />
<text class="text"style="top:8px;left: 10px;">CC</text>
<text class="text"style="top: 25px;right:10px">2024-12-01评价</text>
</view>
<view >
<view class="container">
<image class="left" mode="scaleToFill" src="/pages/image/meijia3.jpg" />
<view class="messagebox">
<image class="left" mode="scaleToFill" src="/pages/image/meijia3.jpg" />
<view class="message">
<text>{{item.review}}</text>
</view>
</view>
<view style="margin-top:10px;margin-left:20px">
<text style="font-size:12px">综合评分:5星 | 款式:【半贴短甲彩绘款】</text>
</view>

View File

@ -3,6 +3,7 @@ Page({
data: {
current: 0,
businessName:'',
message:[],
items: [
{
title: '全部',
@ -17,7 +18,7 @@ Page({
image:'https://c-ssl.dtstatic.com/uploads/blog/202305/08/20230508112951_78480.thumb.400_0.jpeg'
}
],
},
onShow(){
my.getStorage({
@ -33,14 +34,18 @@ Page({
url: url + '/api/level/list',
method: 'POST',
data: {
id: this.data.id
},
headers: {
'content-type': 'application/json',
},
dataType: 'json',
success: (res) => {
console.log(res,"sadkaskd");
console.log(res,"sadkaskd"),
this.setData({
message:res.data.data
}),
console.log(this.data.message);
},
fail: (error) => {
console.error('请求失败: ', JSON.stringify(error));

View File

@ -9,7 +9,7 @@
swiped="{{swipeIndex === index}}"
onButtonTap="quxiao"
>
<view class="t-swipe-item-con-view">
<view class="t-swipe-item-con-view" data-num="{{item}}" onTap="tiaozhuan">
<view style="display: flex;">
<view class="kuang">
<image class="image" mode="scaleToFill" src="{{item.data.businessAvatar}}" />

View File

@ -198,4 +198,23 @@ Page({
},
});
},
tiaozhuan(item){
const id = item.target.dataset.num
console.log('传递的数据:', id);
const ID = id.data.id
console.log(ID);
const userId = id.data.userId
const address = id.data.address
const businessName = id.data.businessName
const businessAvatar = id.data.businessAvatar
const endBusiness = id.data.endBusiness
const startBusiness = id.data.startBusiness
const storeStatus = id.data.storeStatus
const businessPhone =id.data.businessPhone
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}`,
});
}
});

View File

@ -1,141 +1,85 @@
.box{
width: 100%;
height: 700px;
background-color: antiquewhite;
.chat-message {
display: flex;
margin-bottom: 8px;
}
/* 头 */
.box1{
width: 100%;
height: 50px;
position: absolute;
background-color: #eec2c7;
.message-content {
display: flex;
align-items: center;
}
.box9{
width: 50px;
height: 50px;
position: absolute;
left: 10px;
}
.box9 image{
width: 30px;
height: 30px;
position: absolute;
top: 10px;
.chat-message.user {
justify-content: flex-end;
}
.box10{
width: 50px;
height: 50px;
position: absolute;
left: 150px;
}
.box10 image{
width: 30px;
height: 30px;
position: absolute;
top: 10px;
border-radius: 50px;
.chat-message.bot {
justify-content: flex-start;
}
/* 客服名称 */
.p1{
font-size: 18px;
position: absolute;
left: 190px;
top: 15px;
.chat-message.user .message-content {
flex-direction: row-reverse; /* 头像和气泡反向排列 */
}
/* 对话框 */
.box2{
width: 100%;
height: 700px;
position: absolute;
top: 50px;
background-color: #ffffff;
}
.box2 image{
.avatar {
width: 40px;
height: 40px;
position: absolute;
top: 28px;
left: 15px;
border-radius: 50px;
border-radius: 50%;
margin: 0 8px;
}
/* 客服消息 框 */
.box3{
width: 260px;
height: 40px;
position: absolute;
left: 60px;
top: 25px;
border: 1px #cfcfcf solid;
border-radius: 10px;
.bubble {
max-width: 70%;
padding: 8px;
border-radius: 4px;
background-color: #e0e0e0;
word-wrap: break-word;
}
/* 客服消息 字 */
.p2{
font-size: 15px;
position: absolute;
top: 10px;
left: 10px;
.chat-message.user .bubble {
background-color: #1cbbb4;
color: #fff;
}
.chat-container {
display: flex;
flex-direction: column;
height: 100vh;
justify-content: space-between;
}
.chat-box {
flex: flex;
height: 100%;
padding: 16px;
overflow-y: auto;
background-color: #f9f9f9;
}
.input-box {
display: flex;
align-items: center; /* 垂直居中对齐 */
padding: 5px;
background-color: #f9f9f9;
margin-left: 15px;
}
/* 底部问话框 */
.box4{
width: 388px;
height: 40px;
position: fixed;
bottom: 20px;
border: 2px #cfcfcf solid;
border-radius: 15px;
.box1 {
flex: 1; /* 使输入框占据剩余空间 */
height: 35px; /* 设置输入框的高度 */
padding: 8px; /* 设置输入框内边距 */
font-size: 16px; /* 设置字体大小 */
border: 1px solid #ccc; /* 设置边框 */
border-radius: 4px; /* 设置边框圆角 */
box-sizing: border-box; /* 使内边距和边框包含在宽度和高度内 */
margin-right: 10px; /* 设置输入框和按钮之间的间距 */
}
/* 发送 框和字*/
.box5{
width: 60px;
height: 30px;
position: absolute;
top: 5px;
right: 20px;
background-color: #de868f;
border-radius: 10px;
.send-button {
display: flex; /* 使用 flexbox 布局 */
justify-content: center; /* 水平居中对齐 */
align-items: center; /* 垂直居中对齐 */
background-color: #62adf9; /* 设置按钮背景色 */
border: none; /* 去掉按钮边框 */
padding: 15px 10px; /* 设置按钮内边距 */
color: #fff; /* 设置按钮文字颜色 */
border-radius: 4px; /* 设置按钮圆角 */
cursor: pointer; /* 设置鼠标指针为手型 */
font-size: 16px; /* 设置字体大小 */
}
.p3{
font-size: 16px;
position: absolute;
top: 6px;
left: 15px;
color: #ffffff;
}
/* 询问 */
.box6{
width: 220px;
height: 35px;
position: absolute;
left: 20px;
}
/* 预约 框和字*/
.box7{
width: 60px;
height: 30px;
position: absolute;
bottom: 75px;
right: 20px;
background-color: #58a55c;
border-radius: 10px;
}
.p4{
font-size: 16px;
font-weight: bold;
position: absolute;
top: 6px;
left: 15px;
color: #ffffff;
}

View File

@ -1,35 +1,44 @@
<view class="box">
<view class="box1">
<view class="box9">
<navigator open-type="navigate" url="/pages/shangmenyuyuedianpu/shangmenyuyuedianpu">
<image mode="scaleToFill" src="/pages/image/aback.png" />
</navigator>
</view>
<view class="box10">
<image mode="scaleToFill" src="/pages/image/aqingqing.png" />
</view>
<text class="p1">晟晟</text>
</view>
<view class="box2">
<image mode="scaleToFill" src="/pages/image/aqingqing.png" />
<view class="box3">
<text class="p2">亲,您好!我是你的专属客服晟晟哦</text>
</view>
<view class="box7">
<navigator open-type="navigate" url="/pages/shangmenyuyueshijianduan/shangmenyuyueshijianduan" >
<text class="p4">预约</text>
</navigator>
</view>
<view class="box4">
<form>
<input class="box6" placeholder="请输入您需要咨询的问题?" />
</form>
<view class="box5">
<text class="p3">发送</text>
<view class="chat-container">
<block
a:for="{{typeList}}"
a:for-index="index"
a:for-item="item"
>
<ant-notice
type="{{item}}"
style="margin-bottom: 8px"
enableMarquee="{{true}}"
onTap="handleTapLink"
mode="link"
>
有问题找客服!
</ant-notice>
</block>
<scroll-view class="chat-box" scroll-y="true" scroll-into-view="{{scrollToView}}" scroll-top="{{scrollTop}}">
<view a:for="{{chatMessages}}" a:key="index" class="chat-message {{item.type}}">
<view class="message-content">
<image class="avatar" src="{{item.avatar}}" mode="aspectFit" />
<view class="bubble">
{{item.content}}
</view>
</view>
</view>
</view>
</scroll-view>
</view>
<form onSubmit="onSubmit" class="input-box">
<input
value="{{message}}"
name="message"
onInput="onMessageInput"
onConfirm="onKeyUp"
placeholder="你的美顾问"
class="box1"
required
/>
<view style="margin: 16px;">
<button onTap="onSubmit" class="send-button" onConfirm="onSubmit">发送</button>
</view>
</form>
</view>

View File

@ -1,4 +1,111 @@
Page({
data: {},
onLoad() {},
data: {
message: '',
chatMessages: [],
typeList: ['primary'],
scrollToView: '', // 用于 scroll-into-view 的 id
scrollTop: 0, // 用于 scroll-top 的值
},
onLoad() {
// 在页面加载时添加AI机器人的初始消息
let botAvatar = 'https://bpic.588ku.com/element_origin_min_pic/19/04/27/578456f43714d36fffc68ecc6f8c46e5.jpg'; // 机器人头像URL
let initialMessage = { type: 'bot', content: '请问有什么可以帮到您?', avatar: botAvatar };
this.setData({
chatMessages: [initialMessage]
});
},
onMessageInput(e) {
this.setData({
message: e.detail.value
});
},
onKeyUp(e) {
this.onSubmit();
},
onSubmit() {
my.getStorage({
key: 'userInfo',
success: (res) => {
const userInfo = res.data;
this.setData({
id: userInfo.id, // 获取 id
avatarUrl:userInfo.avatarUrl
});
}
});
let that = this;
let currentMessage = this.data.message;
let userAvatar = this.data.avatarUrl; // 用户头像URL
let botAvatar = 'https://bpic.588ku.com/element_origin_min_pic/19/04/27/578456f43714d36fffc68ecc6f8c46e5.jpg'; // 机器人头像URL
if (!currentMessage.trim()) return; // 防止发送空消息
// 添加用户消息到 chatMessages
this.setData({
chatMessages: [...this.data.chatMessages, { type: 'user', content: currentMessage, avatar: userAvatar }],
message: '',
scrollToView: `user-${Date.now()}` // 滚动到用户消息
});
// 添加“加载中”消息
let loadingMessage = { type: 'bot', content: '加载中...', avatar: botAvatar, id: `loading-${Date.now()}` };
this.setData({
chatMessages: [...this.data.chatMessages, loadingMessage]
});
// 模拟API请求获取机器人回复
my.getStorage({
key: 'openId',
success: (res) => {
my.request({
url: 'http://localhost:5657/chat',
method: 'POST',
data: {
openId: res.data.openId,
requestBody: currentMessage
},
headers: {
'content-type': 'application/json'
},
success: function (res) {
let count = res.data.count; // 假设后端返回的 count 字段
let responseMessage = count >= 10
? { type: 'bot', content: '免费次数已用完', avatar: botAvatar, id: `response-${Date.now()}` }
: { type: 'bot', content: res.data.data, avatar: botAvatar, id: `response-${Date.now()}` };
// 替换“加载中”消息为机器人回复
that.setData({
chatMessages: that.data.chatMessages.map(msg =>
msg.id === loadingMessage.id ? responseMessage : msg
),
scrollToView: responseMessage.id // 滚动到最新回复
});
},
fail: function (error) {
console.error('fail: ', JSON.stringify(error));
// 如果请求失败,替换“加载中”消息为错误消息
that.setData({
chatMessages: that.data.chatMessages.map(msg =>
msg.id === loadingMessage.id ? { type: 'bot', content: '请求失败,请稍后再试', avatar: botAvatar, id: `response-${Date.now()}` } : msg
),
scrollToView: `response-${Date.now()}` // 滚动到最新错误消息
});
}
});
}
});
},
handleTapLink() {
my.alert({
title: '提示', // 可选,弹窗标题
content: '别点了再点也是10次', // 主要内容
buttonText: '确定', // 可选,按钮文字
});
},
});

View File

@ -1,5 +1,7 @@
{
"defaultTitle": "咨询",
"usingComponents": {},
"usingComponents": {
"ant-notice": "antd-mini/es/NoticeBar/index"
},
"styleIsolation": "apply-shared"
}