Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
G
groupPurchase-miniapp
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
彭佳妮(贵阳日报)
groupPurchase-miniapp
Commits
9e429445
Commit
9e429445
authored
Aug 12, 2024
by
刘玉宏
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'master' of
http://gitlab.platform.xinhuaapp.com/pengjiani/groupPurchase-miniapp
parents
77781584
23189d75
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
25 changed files
with
803 additions
and
326 deletions
+803
-326
App.vue
src/App.vue
+0
-1
DepartureDate.vue
src/Components/assistingAgriculture/index/DepartureDate.vue
+1
-2
Screen.vue
src/Components/assistingAgriculture/index/Screen.vue
+54
-21
fab.vue
src/Components/fab/fab.vue
+51
-0
reviewDetails.js
src/api/assistingAgriculture/reviewDetails.js
+17
-0
route.js
src/api/assistingAgriculture/route.js
+66
-0
scenicSpotDetails.js
src/api/assistingAgriculture/scenicSpotDetails.js
+10
-0
shop.js
src/api/assistingAgriculture/shop.js
+8
-0
village.js
src/api/assistingAgriculture/village.js
+8
-0
packageDetail.js
src/api/packageDetail.js
+9
-0
pages.json
src/pages.json
+3
-1
RouteDetails.vue
src/pages/assistingAgriculture/RouteDetails/RouteDetails.vue
+0
-0
RuralTravel.vue
src/pages/assistingAgriculture/RuralTravel/RuralTravel.vue
+34
-7
ConfirmOrder.vue
src/pages/assistingAgriculture/cart/ConfirmOrder.vue
+32
-28
cart.vue
src/pages/assistingAgriculture/cart/cart.vue
+9
-1
card.vue
src/pages/assistingAgriculture/commentList/card.vue
+25
-27
index.vue
src/pages/assistingAgriculture/commentList/index.vue
+121
-76
comment.vue
src/pages/assistingAgriculture/detail/comment.vue
+172
-35
detail.vue
src/pages/assistingAgriculture/order/detail.vue
+77
-41
reviewDetails.vue
...ages/assistingAgriculture/reviewDetails/reviewDetails.vue
+69
-26
scenicSpotDetails.vue
.../assistingAgriculture/reviewDetails/scenicSpotDetails.vue
+22
-7
index.vue
src/pages/index/index.vue
+8
-50
order.vue
src/pages/order/order.vue
+5
-2
packageDetails.vue
src/pages/packageDetails/packageDetails.vue
+1
-0
vite.config.ts
vite.config.ts
+1
-1
No files found.
src/App.vue
View file @
9e429445
...
...
@@ -4,7 +4,6 @@ onLaunch(() => {});
onShow
(()
=>
{
console
.
log
(
'App Show'
);
});
onHide
(()
=>
{
console
.
log
(
'App Hide'
);
});
...
...
src/Components/assistingAgriculture/index/DepartureDate.vue
View file @
9e429445
...
...
@@ -8,7 +8,7 @@
:class=
"
{ active: selectedItem === index }"
@tap="selectItem(index, item)"
>
{{
item
}}
{{
item
.
startDate
}}
</li>
<wd-calendar
use-default-slot
v-model=
"value"
@
confirm=
"handleConfirm4"
>
<li>
选择日期
</li>
...
...
@@ -46,7 +46,6 @@ const selectItem = (index, item) => {
const
getStartDateList
=
()
=>
{
getStartDate
(
params
).
then
((
res
)
=>
{
dataList
.
value
=
res
.
data
;
console
.
log
(
Object
.
keys
(
dataList
.
value
,
232
));
});
};
function
handleConfirm4
({
value
})
{
...
...
src/Components/assistingAgriculture/index/Screen.vue
View file @
9e429445
<
template
>
<view
class=
"sort"
:style=
"
{ width: width }">
<view
class=
"date"
>
筛选
</view>
<view
class=
"date"
>
出发城市
</view>
<ul
class=
"ul"
>
<li
v-for=
"(item, index) in
items
"
v-for=
"(item, index) in
screenList
"
:key=
"index"
:class=
"
{ active: selectedItem === index }"
@tap="selectItem(index)"
@tap="selectItem(index
, item, 'screen'
)"
>
{{
item
}}
{{
item
.
tripCity
}}
</li>
</ul>
<view
class=
"date"
>
服务承诺
</view>
<ul
class=
"ul"
>
<li
v-for=
"(item, index) in serveList"
:key=
"index"
:class=
"
{ active: selectedItem1 === index }"
@tap="selectItem(index, item, 'serve')"
>
{{
item
.
labelName
}}
</li>
</ul>
<view
class=
"date"
>
适用人群
</view>
<ul
class=
"ul"
>
<li
v-for=
"(item, index) in peopleList"
:key=
"index"
:class=
"
{ active: selectedItem2 === index }"
@tap="selectItem(index, item, 'people')"
>
{{
item
.
labelName
}}
</li>
</ul>
</view>
</
template
>
<
script
setup
>
import
{
defineProps
}
from
'vue'
;
const
items
=
reactive
([
'智能排序'
,
'距离优先'
,
'好评优先'
,
'销量优先'
,
'低价优先'
,
'低价优先'
,
'距离优先'
,
'好评优先'
,
'销量优先'
,
'低价优先'
,
'距离优先'
,
]);
import
{
defineProps
,
onMounted
,
ref
}
from
'vue'
;
import
{
screeningConditions
}
from
'@/api/assistingAgriculture/village'
;
const
emit
=
defineEmits
([
'screenParams'
]);
const
selectedItem
=
ref
(
null
);
const
selectedItem1
=
ref
(
null
);
const
selectedItem2
=
ref
(
null
);
const
screenList
=
ref
([]);
const
serveList
=
ref
([]);
const
peopleList
=
ref
([]);
const
props
=
defineProps
({
width
:
{
type
:
String
,
default
:
'100%'
,
},
});
const
selectItem
=
(
selectItem
)
=>
{
selectedItem
.
value
=
selectItem
;
onMounted
(
async
()
=>
{
getScreeningConditions
();
});
const
selectItem
=
(
index
,
item
,
type
)
=>
{
if
(
type
===
'screen'
)
{
selectedItem
.
value
=
index
;
}
else
if
(
type
===
'serve'
)
{
selectedItem1
.
value
=
index
;
}
else
if
(
type
===
'people'
)
{
selectedItem2
.
value
=
index
;
}
emit
(
'screenParams'
,
item
,
type
);
};
// 查询出发日期
const
getScreeningConditions
=
()
=>
{
screeningConditions
().
then
((
res
)
=>
{
screenList
.
value
=
res
.
data
.
startCityList
;
serveList
.
value
=
res
.
data
.
serviceList
;
peopleList
.
value
=
res
.
data
.
forPeopleList
;
});
};
</
script
>
...
...
@@ -68,7 +102,6 @@ const selectItem = (selectItem) => {
letter-spacing
:
0em
;
font-variation-settings
:
'opsz'
auto
;
font-feature-settings
:
'kern'
on
;
color
:
#fa5151
;
margin-left
:
44rpx
;
margin-top
:
20rpx
;
}
...
...
src/Components/fab/fab.vue
0 → 100644
View file @
9e429445
<
template
>
<!-- 悬浮按钮 -->
<wd-fab
type=
"error"
position=
"right-bottom"
direction=
"left"
:draggable=
"true"
inactiveIcon=
"a-controlplatform"
>
<view
class=
"custom-button"
@
click=
"go('/pages/ticket/ticket')"
>
<image
class=
"fab-icon"
src=
"../../static/index/coupon.png"
></image>
<text
class=
"fab-text"
>
优惠券
</text>
</view>
<view
class=
"custom-button"
@
click=
"go('/pages/order/order')"
>
<image
class=
"fab-icon"
src=
"../../static/index/order.png"
></image>
<text
class=
"fab-text"
>
订单
</text>
</view>
</wd-fab>
</
template
>
<
script
setup
>
// 前往个人中心
const
go
=
(
url
)
=>
{
xma
.
navigateTo
({
url
,
});
};
</
script
>
<
style
lang=
"scss"
scoped
>
.custom-button
{
min-width
:
auto
;
box-sizing
:
border-box
;
gap
:
10rpx
;
margin
:
8rpx
;
display
:
flex
;
flex-direction
:
column
;
align-items
:
center
;
justify-content
:
center
;
.fab-icon
{
width
:
64rpx
;
height
:
64rpx
;
}
.fab-text
{
font-size
:
20rpx
;
color
:
#333
;
}
}
</
style
>
src/api/assistingAgriculture/reviewDetails.js
0 → 100644
View file @
9e429445
import
{
request
}
from
'../../utils/request'
;
// 查询评论详情
export
function
evaluationGetById
(
data
)
{
return
request
({
url
:
`/sgyrdd/evaluation/getById`
,
method
:
'GET'
,
data
,
});
}
export
function
prodGetProd
(
data
)
{
return
request
({
url
:
`/sgyrdd/prod/getProd`
,
method
:
'GET'
,
data
,
});
}
src/api/assistingAgriculture/route.js
0 → 100644
View file @
9e429445
import
{
request
}
from
'../../utils/request'
;
// 查询商品详情接口
export
function
getProd
(
data
)
{
return
request
({
url
:
`/sgyrdd/prod/getProd`
,
method
:
'GET'
,
data
,
});
}
// 查询商品详情接口
export
function
getEvalStatis
(
data
)
{
return
request
({
url
:
`/sgyrdd/evaluation/getEvalStatis`
,
method
:
'GET'
,
data
,
});
}
// 获取评价列表第一条
export
function
getEvaluationOne
({
shopId
,
prodId
})
{
return
request
({
url
:
`/sgyrdd/evaluation/page`
,
method
:
'GET'
,
data
:
{
shopId
,
prodId
,
size
:
1
,
current
:
1
,
},
});
}
// 查询商家相册列表
export
function
getPhoto
({
shopId
,
prodId
})
{
return
request
({
url
:
`/sgyrdd/photo/getPhoto`
,
method
:
'GET'
,
data
:
{
shopId
,
prodId
,
},
});
}
// 查询商家相册列表
export
function
getMealList
(
data
)
{
return
request
({
url
:
`/sgyrdd/znprod/meal/list`
,
method
:
'GET'
,
data
,
});
}
// 查询价格日历接口
export
function
getPriceList
(
data
)
{
return
request
({
url
:
`/sgyrdd/znprod/price/list`
,
method
:
'GET'
,
data
,
});
}
// 查询行程活动接口
export
function
getItinerary
(
data
)
{
return
request
({
url
:
`/sgyrdd/znprod/activity/list`
,
method
:
'GET'
,
data
,
});
}
src/api/assistingAgriculture/scenicSpotDetails.js
0 → 100644
View file @
9e429445
import
{
request
}
from
'../../utils/request'
;
// 查询景点详情接口
export
function
znprodTourList
(
data
)
{
return
request
({
url
:
`/sgyrdd/znprod/tour/list`
,
method
:
'GET'
,
data
,
});
}
src/api/assistingAgriculture/shop.js
View file @
9e429445
...
...
@@ -64,3 +64,11 @@ export function sgyOrderOrderInfo(data) {
data
,
});
}
// 筑农首页-3、订单详情
export
function
quantity
(
data
)
{
return
request
({
url
:
`/sgyrdd/sgyBasket/quantity`
,
method
:
'POST'
,
data
,
});
}
src/api/assistingAgriculture/village.js
View file @
9e429445
...
...
@@ -32,3 +32,11 @@ export function getStartDate(data) {
data
,
});
}
// 查询筛选
export
function
screeningConditions
(
data
)
{
return
request
({
url
:
`/sgyrdd/prod/screeningConditions/list`
,
method
:
'GET'
,
data
,
});
}
src/api/packageDetail.js
View file @
9e429445
...
...
@@ -73,3 +73,12 @@ export function getEvalStatis(data) {
data
,
});
}
// 评论列表数量统计和相同好评最多的评语
export
function
getEvalStatisByShopId
(
data
)
{
return
request
({
url
:
`/sgyrdd/evaluation/getShopEvalStatis`
,
method
:
'GET'
,
data
,
});
}
src/pages.json
View file @
9e429445
...
...
@@ -225,7 +225,9 @@
"style"
:
{
"navigationBarTitleText"
:
"景点详情"
,
"navigationBarBackgroundColor"
:
"#ffffff"
,
"navigationStyle"
:
""
"navigationStyle"
:
""
,
"enablePullDownRefresh"
:
true
,
"onReachBottomDistance"
:
50
}
},
{
...
...
src/pages/assistingAgriculture/RouteDetails/RouteDetails.vue
View file @
9e429445
This diff is collapsed.
Click to expand it.
src/pages/assistingAgriculture/RuralTravel/RuralTravel.vue
View file @
9e429445
...
...
@@ -55,7 +55,12 @@
:scroll-with-animation=
"true"
@
scroll=
"scroll"
>
<view
class=
"foodCard"
v-for=
"(item, index) in popularRouterData"
:key=
"index"
>
<view
class=
"foodCard"
v-for=
"(item, index) in popularRouterData"
:key=
"index"
@
tap=
"toRouteDetails(item)"
>
<!--
<img-->
<!-- class="img-icon"-->
<!-- src="/static/assistingAgriculture/rural/icon.png"-->
...
...
@@ -120,7 +125,7 @@
class=
"card-detail"
v-for=
"(item, index) in cardList"
:key=
"index"
@
tap=
"toRouteDetails"
@
tap=
"toRouteDetails
(item)
"
>
<img
class=
"card-img"
:src=
"item.img"
style=
"width: 248rpx; height: 240rpx"
/>
<view
class=
"detail-text"
>
...
...
@@ -173,7 +178,10 @@ const cardList = ref([]);
const
popularRouterData
=
ref
([]);
const
sortType
=
ref
(
null
);
const
attractionId
=
ref
(
null
);
const
startCity
=
ref
(
null
);
const
dateType
=
ref
(
null
);
const
serviceCommitment
=
ref
(
null
);
const
labelId
=
ref
(
null
);
const
locationFiltering
=
(
index
)
=>
{
switch
(
index
)
{
case
0
:
...
...
@@ -205,6 +213,9 @@ const locationFiltering = (index) => {
sortType
.
value
=
null
;
attractionId
.
value
=
null
;
dateType
.
value
=
null
;
startCity
.
value
=
null
;
serviceCommitment
.
value
=
null
;
labelId
.
value
=
null
;
}
};
// 查询热门路线
...
...
@@ -223,8 +234,8 @@ const sortParams = (sortMode) => {
};
// 出发日期
const
dataParams
=
(
item
)
=>
{
console
.
log
(
item
,
33
3
);
dateType
.
value
=
item
;
console
.
log
(
item
,
item
.
key
,
2232232
3
);
dateType
.
value
=
item
.
key
;
getProd
();
};
// 景点
...
...
@@ -232,6 +243,18 @@ const placeParams = (id) => {
attractionId
.
value
=
id
;
getProd
();
};
// 筛选
const
screenParams
=
(
item
,
type
)
=>
{
console
.
log
(
item
,
type
,
111
);
if
(
type
===
'screen'
)
{
startCity
.
value
=
item
.
tripCity
;
}
else
if
(
type
===
'serve'
)
{
serviceCommitment
.
value
=
item
.
labelName
;
}
else
if
(
type
===
'people'
)
{
labelId
.
value
=
item
.
labelName
;
}
getProd
();
};
// 查询列表
const
getProd
=
()
=>
{
const
params
=
{
...
...
@@ -239,7 +262,10 @@ const getProd = () => {
size
:
10
,
...(
sortType
.
value
!==
null
&&
{
sortType
:
sortType
.
value
.
sortMode
}),
...(
attractionId
.
value
!==
null
&&
{
attractionId
:
attractionId
.
value
.
id
}),
...(
dateType
.
value
!==
null
&&
{
dateType
:
dateType
.
value
}),
...(
dateType
.
value
!==
null
&&
{
dateType
:
dateType
.
value
.
key
}),
...(
startCity
.
value
!==
null
&&
{
startCity
:
startCity
.
value
}),
...(
serviceCommitment
.
value
!==
null
&&
{
serviceCommitment
:
serviceCommitment
.
value
}),
...(
labelId
.
value
!==
null
&&
{
labelId
:
labelId
.
value
}),
};
getProdList
(
params
).
then
((
res
)
=>
{
res
.
data
.
records
.
forEach
((
item
)
=>
{
...
...
@@ -248,10 +274,11 @@ const getProd = () => {
cardList
.
value
=
res
.
data
.
records
;
});
};
function
toRouteDetails
()
{
function
toRouteDetails
(
item
)
{
console
.
log
(
item
,
22222
);
// TODO: 跳转到线路详情
xma
.
navigateTo
({
url
:
'/pages/assistingAgriculture/RouteDetails/RouteDetails'
,
url
:
`/pages/assistingAgriculture/RouteDetails/RouteDetails?shopId=
${
item
.
shopId
}
,prodId=
${
item
.
prodId
}
`
,
});
}
function
toSpecialOfferZoneList
()
{
...
...
src/pages/assistingAgriculture/cart/ConfirmOrder.vue
View file @
9e429445
...
...
@@ -66,7 +66,7 @@
</view>
<view
class=
"address-content"
@
click=
"jumpToAddressList"
>
<image
class=
"location-pic"
src=
"@/static/assistingAgriculture/assets/location.png"
></image>
<view
class=
"location-text"
>
{{
addressInfo
.
a
reaA
ddr
}}
{{
addressInfo
.
areaName
}}
</view>
<view
class=
"location-text"
>
{{
addressInfo
.
addr
}}
{{
addressInfo
.
areaName
}}
</view>
<wd-icon
custom-class=
"my-icon"
color=
"#666"
name=
"arrow-right"
size=
"22px"
></wd-icon>
</view>
<view
class=
"address-user-info"
>
...
...
@@ -220,30 +220,34 @@ onShow(() => {
if
(
outTradeNos
.
value
)
{
// 查询订单状态决定是否支付
sgyOrderOrderInfo
({
orderNumber
:
outTradeNos
.
value
}).
then
((
res
)
=>
{
// switch (res.data.baseOrder.subStatus) {
// case '1':
// xma.showToast({
// title: '支付失败',
// icon: 'error',
// duration: 2000,
// success() {
// groupBuyConfirmFn(prodIds.value, skuIds.value);
// },
// });
// break;
// case '2':
// xma.redirectTo({
// url: `/pages/shop/paymentSuccessful?outTradeNos=${outTradeNos.value}`,
// });
// break;
// case '3':
// xma.redirectTo({
// url: `/pages/shop/paymentSuccessful?outTradeNos=${outTradeNos.value}`,
// });
// break;
// default:
// break;
// }
switch
(
res
.
data
.
baseOrder
.
subStatus
)
{
case
'1'
:
xma
.
showToast
({
title
:
'支付失败'
,
icon
:
'error'
,
duration
:
1000
,
success
()
{
setTimeout
(()
=>
{
xma
.
redirectTo
({
url
:
`/pages/assistingAgriculture/order/detail?orderNumber=
${
outTradeNos
.
value
}
`
,
});
},
1500
);
},
});
break
;
case
'2'
:
xma
.
redirectTo
({
url
:
`/pages/assistingAgriculture/order/detail?orderNumber=
${
outTradeNos
.
value
}
`
,
});
break
;
case
'3'
:
xma
.
redirectTo
({
url
:
`/pages/assistingAgriculture/order/detail?orderNumber=
${
outTradeNos
.
value
}
`
,
});
break
;
default
:
break
;
}
});
}
});
...
...
@@ -333,7 +337,7 @@ const useraddrDefaultUserAddrFn = () => {
addressInfo
.
value
=
res
.
data
;
addressParams
.
value
.
receiverName
=
res
.
data
.
receiver
;
addressParams
.
value
.
receiverMobile
=
res
.
data
.
mobile
;
addressParams
.
value
.
receiverAddress
=
res
.
data
.
a
reaA
ddr
;
addressParams
.
value
.
receiverAddress
=
res
.
data
.
addr
;
resolve
();
}
});
...
...
@@ -378,7 +382,7 @@ const payNow = async (data) => {
if
(
res
.
code
===
0
)
{
openUrl
(
res
.
data
.
result
);
}
else
{
groupBuyConfirmFn
(
prodIds
.
value
,
sku
Ids
.
value
);
sgyrddBasketConfirmFn
(
basket
Ids
.
value
);
}
});
}
...
...
@@ -796,12 +800,12 @@ page {
.content
{
font-size
:
24rpx
;
font-weight
:
500
;
width
:
100%
;
max-height
:
243rpx
;
background
:
#fafafa
;
color
:
#77818f
;
box-sizing
:
border-box
;
border-radius
:
12rpx
;
margin
:
0
auto
;
}
}
.xj-content
{
...
...
src/pages/assistingAgriculture/cart/cart.vue
View file @
9e429445
...
...
@@ -31,7 +31,7 @@
<span>
¥
</span>
{{
item
.
skuPrice
}}
</div>
<wd-input-number
v-model=
"item.count"
/>
<wd-input-number
v-model=
"item.count"
@
change=
"changeQuantity(item)"
/>
</div>
</div>
</div>
...
...
@@ -60,6 +60,7 @@
import
{
ref
,
computed
,
onMounted
}
from
'vue'
;
import
{
getshoppingCartList
}
from
'../../../api/packageDetail'
;
import
{
categoryPresaleList
}
from
'../../../api/assistingAgriculture/building'
;
import
{
quantity
}
from
'../../../api/assistingAgriculture/shop'
;
// 计算是否全选
const
checkedAll
=
computed
(()
=>
{
return
cartList
.
value
.
every
((
item
)
=>
item
.
isChecked
);
...
...
@@ -114,6 +115,13 @@ const presaleSortList = (index) => {
});
});
};
// 购物车数量修改
const
changeQuantity
=
async
(
item
)
=>
{
const
res
=
await
quantity
({
basketId
:
item
.
basket
.
basketId
,
basketCount
:
item
.
count
,
});
};
const
selectedItems
=
computed
(()
=>
{
return
cartList
.
value
.
reduce
((
acc
,
shop
)
=>
{
const
selectedProducts
=
shop
.
prodInfos
.
filter
((
item
)
=>
item
.
isChecked
);
...
...
src/pages/assistingAgriculture/commentList/card.vue
View file @
9e429445
<
template
>
<div
class=
"card"
>
<div
class=
"card"
v-for=
"(item, index) in commentData"
:key=
"index"
>
<div
class=
"card-top"
>
<div
class=
"avatar flex-align-center"
>
<img
src=
"/static/assistingAgriculture/comment/1.png
"
alt=
""
/>
<img
:src=
"item.avatar
"
alt=
""
/>
<div
class=
"name"
>
<p>
不爱吃鱼的小猫咪
</p>
<div
class=
"flex-align-center"
>
<img
src=
"/src/static/assistingAgriculture/comment/emoji.png"
alt=
""
/>
5.0分 好评
</div>
<p>
{{
item
.
nickName
}}
</p>
<div
class=
"grade flex-align-center"
>
5.0分
</div>
</div>
</div>
<div
class=
"info"
>
2024-08-03发表于贵州 | 朋友出游 | 2024-07-22出发
</div>
<div
class=
"info"
>
{{
item
.
createTime
[
0
]
}}
发表
</div>
</div>
<div
class=
"card-content"
>
<div
class=
"text-wrap"
:style=
"showMore ? 'max-height:none;' : ''"
>
跟团游行程紧凑有序,充分利用了时间,让游客能够在有限的时间内充分游览黄果树的主要景点,如黄果树大瀑布、陡坡塘瀑布、天星桥景区等,不留遗憾。导游专业且热情,对景区有深入的了解,能够生动有趣地讲解景点的历史、文化和特色,同时耐心解答游跟团游行程紧凑有序,充分利用了时间,让游客能够在有限的时间内充分游览黄果树的主要景点,如黄果树大瀑布、陡坡塘瀑布、天星桥景区等,不留遗憾。导游专业且热情,对景区有深入的了解,能够生动有趣地讲解景点的历史、文化和特色,同时耐心解答游跟团游行程紧凑有序,充分利用了时间,让游客能够在有限的时间内充分游览黄果树的主要景点,如黄果树大瀑布、陡坡塘瀑布、天星桥景区等,不留遗憾。导游专业且热情,对景区有深入的了解,能够生动有趣地讲解景点的历史、文化和特色,同时耐心解答游
<div
class=
"more"
v-if=
"!showMore"
@
click=
"showMore = true"
>
全文
</div>
<div
class=
"text-wrap"
>
{{
item
.
evaluation
}}
</div>
<div
class=
"img-wrap"
>
<wd-img
v-for=
"v in Math.floor(Math.random() * 6 + 1)"
:key=
"v"
:src=
"`/src/static/assistingAgriculture/comment/$
{v}.png`"
enable-preview
/>
<wd-img
v-for=
"(item, index) in item.images"
:key=
"index"
:src=
"item"
enable-preview
/>
</div>
</div>
</div>
...
...
@@ -33,6 +24,12 @@
<
script
setup
>
import
{
ref
}
from
'vue'
;
const
showMore
=
ref
(
false
);
const
props
=
defineProps
({
commentData
:
{
type
:
Array
,
default
:
()
=>
[],
},
});
</
script
>
<
style
lang=
"scss"
scoped
>
...
...
@@ -40,6 +37,7 @@ const showMore = ref(false);
background-color
:
#fff
;
border-radius
:
16rpx
;
padding
:
20rpx
;
margin-bottom
:
10rpx
;
.card-top
{
padding-bottom
:
20rpx
;
border-bottom
:
2rpx
solid
#f3f3f3
;
...
...
@@ -55,23 +53,23 @@ const showMore = ref(false);
font-size
:
28rpx
;
color
:
#3d3d3d
;
}
div
{
.grade
{
margin-top
:
18rpx
;
font-size
:
16rpx
;
background
:
rgba
(
253
,
223
,
109
,
0
.1686
);
line-height
:
24rpx
;
color
:
#e1961d
;
width
:
116rpx
;
//
width: 116rpx;
border-radius
:
200rpx
;
padding-left
:
32rpx
;
//
padding-left: 32rpx;
box-sizing
:
border-box
;
position
:
relative
;
img
{
height
:
24rpx
;
position
:
absolute
;
left
:
0
;
width
:
24rpx
;
}
//
img {
//
height: 24rpx;
//
position: absolute;
//
left: 0;
//
width: 24rpx;
//
}
}
}
}
...
...
@@ -88,7 +86,7 @@ const showMore = ref(false);
line-height
:
normal
;
color
:
#3d3d3d
;
overflow
:
hidden
;
max-height
:
150rpx
;
//
max-height: 150rpx;
position
:
relative
;
.more
{
position
:
absolute
;
...
...
src/pages/assistingAgriculture/commentList/index.vue
View file @
9e429445
...
...
@@ -2,37 +2,52 @@
<div
class=
"comment-list"
>
<div
class=
"top-bar flex-align-center"
>
<wd-icon
name=
"thin-arrow-left"
></wd-icon>
<wd-search
hide-cancel
placeholder=
"点评关键词/特色"
placeholder-left
/>
<wd-search
@
search=
"search"
hide-cancel
placeholder=
"点评关键词/特色"
placeholder-left
/>
</div>
<scroll-view
class=
"content"
:scroll-y=
"true"
>
<scroll-view
@
scrolltolower=
"scrolltolower"
class=
"content"
:scroll-y=
"true"
>
<div
class=
"filter-box"
>
<div
class=
"score-sort flex-between"
>
<div
class=
"score"
>
<span
class=
"num"
>
6.9
</span>
<
span
class=
"t1"
>
超棒
</span
>
<span
class=
"t2"
>
527
条
</span>
<
wd-icon
name=
"check-outline"
class=
"t1"
></wd-icon
>
<span
class=
"num"
>
{{
topData
.
score
}}
</span>
<
!--
<span
class=
"t1"
>
超棒
</span>
--
>
<span
class=
"t2"
>
{{
topData
.
count
}}
条
</span>
<
!--
<wd-icon
name=
"check-outline"
class=
"t1"
></wd-icon>
--
>
</div>
<div
class=
"sort"
>
<
!--
<
div
class=
"sort"
>
<span
class=
"active"
>
推荐排序
</span>
|
<span>
重新点评
</span>
</div>
</div>
-->
</div>
<div
class=
"type flex-between"
>
<p
class=
"active"
>
全部
</p>
<p
v-for=
"(v, i) in commentTypeList"
:key=
"i"
>
{{
v
.
text
}}
(
{{
v
.
value
}}
)
</p>
<p
@
tap=
"choice(-1)"
:class=
"
{ active: select === -1 }">全部
</p>
<p
@
tap=
"choice(i, v.type)"
:class=
"
{ active: select === i }"
v-for="(v, i) in commentTypeList"
:key="i"
>
{{
v
.
text
}}
(
{{
v
.
value
}}
)
</p>
</div>
<div
class=
"tags"
:style=
"
{ 'max-height': showMoreTag ? '600px' : '90rpx' }">
<div
class=
"item"
v-for=
"(v, i) in tagList"
:key=
"i"
>
{{
v
.
text
}}
(
{{
v
.
value
}}
)
</div>
<div
class=
"more"
@
click=
"showMoreTag = !showMoreTag"
>
<div
class=
"tags"
>
<div
class=
"item"
v-for=
"(v, i) in tagList"
:key=
"i"
>
{{
v
.
evaluation
}}
(
{{
v
.
count
}}
)
</div>
<!--
<div
class=
"more"
@
click=
"showMoreTag = !showMoreTag"
>
更多
<wd-icon
name=
"arrow-down"
:class=
"
{ rotate: showMoreTag }">
</wd-icon>
</div>
</div>
-->
</div>
</div>
<div
class=
"card-list"
>
<card
v-for=
"v in 10"
:key=
"v"
/>
<card
:commentData=
"commentData"
/>
<view
style=
"width: 100%; text-align: center; font-size: 24rpx; margin: 10rpx 0; color: #888989"
v-if=
"show"
>
没有更多啦~
</view>
</div>
</scroll-view>
<div
class=
"back"
>
...
...
@@ -44,91 +59,120 @@
<
script
setup
>
import
{
ref
}
from
'vue'
;
import
card
from
'./card.vue'
;
import
{
getCommentList
}
from
'../../../api/packageDetail'
;
const
commentTypeList
=
[
import
{
getCommentList
,
getEvalStatis
}
from
'../../../api/packageDetail'
;
const
commentTypeList
=
reactive
(
[
{
text
:
'图/视频'
,
value
:
183
,
value
:
0
,
type
:
'img'
,
},
{
text
:
'追评'
,
value
:
5
,
value
:
0
,
type
:
'append'
,
},
{
text
:
'中差评'
,
value
:
5
,
value
:
0
,
type
:
'diff'
,
},
{
text
:
'好评'
,
value
:
514
,
},
];
const
tagList
=
[
{
text
:
'餐食棒'
,
value
:
44
,
},
{
text
:
'导游负责耐心'
,
value
:
44
,
},
{
text
:
'车辆条件好'
,
value
:
514
,
},
{
text
:
'餐食棒'
,
value
:
44
,
},
{
text
:
'餐食棒'
,
value
:
44
,
},
{
text
:
'导游负责耐心'
,
value
:
44
,
},
{
text
:
'行程安排合理'
,
value
:
5
,
},
{
text
:
'车辆条件好'
,
value
:
514
,
},
{
text
:
'行程安排合理'
,
value
:
5
,
value
:
0
,
type
:
'good'
,
},
{
text
:
'导游负责耐心'
,
value
:
44
,
},
{
text
:
'行程安排合理'
,
value
:
5
,
},
{
text
:
'车辆条件好'
,
value
:
514
,
},
];
]);
const
imgUrl
=
import
.
meta
.
env
.
VITE_APP_IMG_URL
;
const
tagList
=
ref
([]);
const
commentData
=
ref
([]);
const
commentParameters
=
{
shopId
:
'1818876196597334017'
,
prodId
:
'43828'
,
current
:
1
,
size
:
10
,
};
const
show
=
ref
(
false
);
let
total
;
const
select
=
ref
(
-
1
);
const
topData
=
ref
({});
onLoad
((
options
)
=>
{
getEvalStatisFn
();
getCommentListFn
();
});
const
search
=
(
e
)
=>
{
reset
();
commentParameters
.
evaluation
=
e
.
value
;
getCommentListFn
();
};
// 数据重置
const
reset
=
()
=>
{
commentParameters
.
current
=
1
;
commentData
.
value
=
[];
show
.
value
=
false
;
};
const
scrolltolower
=
()
=>
{
console
.
log
(
'触底加载触底加载触底加载'
);
if
(
commentData
.
value
.
length
<
total
)
{
commentParameters
.
current
++
;
getCommentListFn
();
return
;
}
show
.
value
=
true
;
};
// 触底加载
onReachBottom
(()
=>
{
if
(
cardData2
.
value
.
length
+
5
<
total
)
{
listParams
.
current
++
;
getMerchantListPaging
();
}
});
const
showMoreTag
=
ref
(
false
);
// 评论列表数量统计和相同好评最多的评语
const
getEvalStatisFn
=
()
=>
{
getEvalStatis
({
prodId
:
commentParameters
.
prodId
}).
then
((
res
)
=>
{
console
.
log
(
'评论数量统计和相同好评最多的评语'
,
res
);
res
.
data
.
score
=
res
.
data
.
score
.
toFixed
(
1
);
topData
.
value
=
res
.
data
;
tagList
.
value
=
res
.
data
.
evals
;
commentTypeList
[
0
].
value
=
res
.
data
.
imgCount
;
commentTypeList
[
1
].
value
=
res
.
data
.
append
;
commentTypeList
[
2
].
value
=
res
.
data
.
diffCount
;
commentTypeList
[
3
].
value
=
res
.
data
.
goodCount
;
});
};
// 评论列表
const
getCommentListFn
=
()
=>
{
xma
.
showLoading
({
title
:
'加载中...'
,
mask
:
true
,
});
getCommentList
(
commentParameters
).
then
((
res
)
=>
{
console
.
log
(
'打印评论'
,
res
);
xma
.
hideLoading
();
total
=
res
.
data
.
total
;
res
.
data
.
records
.
forEach
((
v
)
=>
{
v
.
avatar
=
imgUrl
+
v
.
avatar
;
v
.
prodPic
=
imgUrl
+
v
.
prodPic
;
v
.
createTime
=
v
.
createTime
.
split
(
' '
);
if
(
v
.
images
)
{
v
.
images
=
v
.
images
.
split
(
','
).
map
((
item
)
=>
{
item
=
imgUrl
+
item
;
return
item
;
});
}
// console.log('v.images', v.images);
});
console
.
log
(
'res.data.records'
,
res
.
data
.
records
);
commentData
.
value
=
[...
commentData
.
value
,
...
res
.
data
.
records
];
});
};
// tabs选择
const
choice
=
(
i
,
type
)
=>
{
select
.
value
=
i
;
reset
();
commentParameters
.
type
=
type
;
getCommentListFn
();
};
</
script
>
<
style
lang=
"scss"
scoped
>
...
...
@@ -188,6 +232,7 @@ uni-page-body {
.type
{
font-size
:
22rpx
;
color
:
#767676
;
box-sizing
:
border-box
;
.active
{
color
:
#3d3d3d
;
font-size
:
24rpx
;
...
...
@@ -212,7 +257,7 @@ uni-page-body {
flex-wrap
:
wrap
;
gap
:
10rpx
;
position
:
relative
;
max-height
:
80rpx
;
//
max-height: 80rpx;
overflow
:
hidden
;
transition
:
all
0
.3s
;
.item
{
...
...
src/pages/assistingAgriculture/detail/comment.vue
View file @
9e429445
...
...
@@ -10,14 +10,26 @@
@
click=
"handleBack"
></wd-icon>
<view
class=
"searchBox"
>
<wd-icon
name=
"search"
size=
"24rpx"
color=
"#ABAAAA"
></wd-icon>
<input
type=
"text"
:value=
"searchValue"
class=
"text"
placeholder=
"点评关键词/特色"
placeholder-style=
"font-size:22rpx;"
/>
<view
class=
"search"
>
<wd-icon
name=
"search"
size=
"24rpx"
color=
"#ABAAAA"
></wd-icon>
<input
type=
"text"
:value=
"catalog.evaluation"
class=
"text"
placeholder=
"点评关键词/特色"
placeholder-style=
"font-size:22rpx;"
@
confirm=
"handleSearch"
@
input=
"handleInput"
confirm-type=
"搜索"
/>
</view>
<wd-icon
name=
"error-fill"
size=
"30rpx"
color=
"#999"
v-if=
"catalog.evaluation"
@
tap=
"handleClear"
></wd-icon>
</view>
</view>
...
...
@@ -31,10 +43,11 @@
@click="handleChangeTab(item.value)"
>
{{
item
.
label
}}
<view
v-if=
"item.value !== 'all'"
>
(
{{
totalList
[
item
.
text
]
}}
)
</view>
</view>
</view>
<view
class=
"comment-list"
>
<view
class=
"comment-list"
v-if=
"commentData.length > 0"
>
<view
class=
"comment-item"
v-for=
"(item, index) in commentData"
:key=
"index"
>
<view
class=
"top"
>
<view
class=
"row"
>
...
...
@@ -48,52 +61,69 @@
</view>
</view>
</view>
<text
class=
"detail"
>
{{
item
.
createTime
.
slice
(
0
,
10
)
}}
{{
item
.
prodName
}}
x2
</text>
<text
class=
"detail"
>
{{
item
.
createTime
.
slice
(
0
,
10
)
}}
{{
item
.
prodName
}}
</text>
</view>
<view
class=
"info"
>
<!--
<div
class=
"text-wrap"
:style=
"item.showMore ? 'max-height:none;' : ''"
>
跟团游行程紧凑有序,充分利用了时间,让游客能够在有限的时间内充分游览黄果树的主要景点,如黄果树大瀑布、陡坡塘瀑布、天星桥景区等,不留遗憾。导游专业且热情,对景区有深入的了解,能够生动有趣地讲解景点的历史、文化和特色,同时耐心解答游跟团游行程紧凑有序,充分利用了时间,让游客能够在有限的时间内充分游览黄果树的主要景点,如黄果树大瀑布、陡坡塘瀑布、天星桥景区等,不留遗憾。导游专业且热情,对景区有深入的了解,能够生动有趣地讲解景点的历史、文化和特色,同时耐心解答游跟团游行程紧凑有序,充分利用了时间,让游客能够在有限的时间内充分游览黄果树的主要景点,如黄果树大瀑布、陡坡塘瀑布、天星桥景区等,不留遗憾。导游专业且热情,对景区有深入的了解,能够生动有趣地讲解景点的历史、文化和特色,同时耐心解答游
<text
class=
"more"
v-if=
"!item.showMore"
@
click=
"item.showMore = true"
>
全文
</text>
</div>
-->
<text
class=
"text"
>
{{
item
.
evaluation
}}
</text>
<view
class=
"imgbox"
v-if=
"item.images.length > 0"
>
<image
class=
"img"
mode=
"aspectFill"
:src=
"fileDomain + img"
v-for=
"img in item.images"
:key=
"img"
v-for=
"(img, index) in item.images"
:key=
"index"
@
tap=
"previewPic(item.images, index)"
></image>
</view>
</view>
</view>
<view
style=
"
width: 100%;
text-align: center;
font-size: 24rpx;
margin-top: 10rpx;
color: #888989;
"
v-if=
"isEnd"
>
没有更多啦~
</view>
</view>
<wd-status-tip
image=
"comment"
tip=
"暂无评论"
v-else
/>
</view>
</view>
</
template
>
<
script
setup
>
import
{
getCommentList
}
from
'@/api/packageDetail'
;
import
{
getCommentList
,
getEvalStatisByShopId
}
from
'@/api/packageDetail'
;
const
fileDomain
=
import
.
meta
.
env
.
VITE_APP_IMG_URL
;
const
searchValue
=
ref
(
''
);
const
tab
=
ref
(
0
);
const
tab
=
ref
(
'all'
);
const
tabs
=
ref
([
{
value
:
0
,
value
:
'all'
,
label
:
'全部'
,
text
:
'count'
,
},
{
value
:
1
,
label
:
'图/视频(183)'
,
},
{
value
:
2
,
label
:
'追评(5)'
,
value
:
'img'
,
label
:
'图/视频'
,
text
:
'imgCount'
,
},
{
value
:
3
,
label
:
'中差评(13)'
,
value
:
'diff'
,
label
:
'中差评'
,
text
:
'diffCount'
,
},
{
value
:
4
,
label
:
'好评(514)'
,
value
:
'good'
,
label
:
'好评'
,
text
:
'goodCount'
,
},
]);
...
...
@@ -120,6 +150,13 @@ const rateList = ref({
},
});
onLoad
(
async
(
options
)
=>
{
catalog
.
shopId
=
options
.
shopId
;
console
.
log
(
options
);
await
getList
();
await
getTotal
();
});
/**
* 获取用户优惠券列表
*/
...
...
@@ -129,11 +166,15 @@ const commentData = ref([]);
const
catalog
=
reactive
({
current
:
0
,
size
:
10
,
shopId
:
'
1818876196597334017
'
,
shopId
:
''
,
evaluation
:
''
,
// 关键字搜索
type
:
''
,
// img-图片,append-追评,diff-中差评,good-好评
});
const
getList
=
async
()
=>
{
catalog
.
type
=
tab
.
value
;
if
(
tab
.
value
===
'all'
)
{
catalog
.
type
=
''
;
}
catalog
.
current
++
;
xma
.
showLoading
({
title
:
'加载中...'
,
...
...
@@ -145,6 +186,7 @@ const getList = async () => {
}
if
(
res
.
data
.
records
.
length
>
0
)
{
res
.
data
.
records
.
forEach
((
item
)
=>
{
item
.
showMore
=
false
;
if
(
item
.
images
===
''
)
{
item
.
images
=
[];
}
else
{
...
...
@@ -153,19 +195,87 @@ const getList = async () => {
});
commentData
.
value
.
push
(...
res
.
data
.
records
);
total
.
value
=
res
.
data
.
total
;
console
.
log
(
commentData
.
value
);
}
xma
.
hideLoading
();
};
getList
();
const
handleChangeTab
=
(
e
)
=>
{
if
(
e
===
tab
.
value
)
return
;
tab
.
value
=
e
;
refresh
().
then
(()
=>
{
getList
();
});
};
const
handleBack
=
()
=>
{
uni
.
navigateBack
();
};
// 下拉刷新
onPullDownRefresh
(()
=>
{
refresh
().
then
(()
=>
{
getList
();
xma
.
stopPullDownRefresh
();
});
});
// 触底函数
onReachBottom
(()
=>
{
if
(
commentData
.
value
.
length
>=
total
.
value
)
{
isEnd
.
value
=
true
;
}
else
{
getList
();
}
});
const
refresh
=
()
=>
{
return
new
Promise
((
resolve
,
reject
)
=>
{
commentData
.
value
=
[];
total
.
value
=
0
;
catalog
.
current
=
0
;
resolve
();
});
};
const
preList
=
ref
([]);
const
previewPic
=
(
item
,
index
)
=>
{
preList
.
value
=
[];
item
.
forEach
((
img
)
=>
{
preList
.
value
.
push
(
fileDomain
+
img
);
});
console
.
log
(
preList
.
value
);
uni
.
previewImage
({
current
:
index
,
// 当前显示图片索引
urls
:
preList
.
value
,
// 需要预览的图片http链接列表
});
};
/**
* 搜索评论
*/
const
handleSearch
=
(
e
)
=>
{
catalog
.
evaluation
=
e
.
detail
.
value
;
refresh
().
then
(()
=>
{
getList
();
});
};
const
handleInput
=
(
e
)
=>
{
catalog
.
evaluation
=
e
.
detail
.
value
;
};
const
handleClear
=
()
=>
{
catalog
.
evaluation
=
''
;
refresh
().
then
(()
=>
{
getList
();
});
};
const
totalList
=
ref
();
const
getTotal
=
async
()
=>
{
const
res
=
await
getEvalStatisByShopId
({
shopId
:
catalog
.
shopId
});
totalList
.
value
=
res
.
data
;
};
</
script
>
<
style
lang=
"scss"
scoped
>
...
...
@@ -180,7 +290,7 @@ page {
.header
{
height
:
88rpx
;
position
:
absolute
;
position
:
fixed
;
width
:
100%
;
z-index
:
999
;
display
:
flex
;
...
...
@@ -197,18 +307,25 @@ page {
border-radius
:
28rpx
28rpx
28rpx
28rpx
;
display
:
flex
;
align-items
:
center
;
padding-left
:
20rpx
;
justify-content
:
space-between
;
padding
:
0rpx
20rpx
;
gap
:
10rpx
;
.text
{
margin-left
:
10rpx
;
font-size
:
22rpx
;
.search
{
gap
:
10rpx
;
display
:
flex
;
align-items
:
center
;
.text
{
margin-left
:
10rpx
;
font-size
:
22rpx
;
}
}
}
}
.content
{
padding
:
98rpx
20rpx
0
;
padding
:
98rpx
20rpx
30rpx
;
display
:
flex
;
flex-direction
:
column
;
gap
:
10rpx
;
...
...
@@ -221,6 +338,8 @@ page {
padding
:
30rpx
30rpx
;
.tab
{
display
:
flex
;
align-items
:
center
;
font-family
:
Source
Han
Sans
;
font-weight
:
500
;
font-size
:
22rpx
;
...
...
@@ -297,6 +416,7 @@ page {
gap
:
10rpx
;
padding
:
2rpx
10rpx
2rpx
26rpx
;
border-radius
:
16rpx
;
width
:
90rpx
;
text
{
font-family
:
Source
Han
Sans
;
...
...
@@ -328,6 +448,23 @@ page {
flex-direction
:
column
;
gap
:
20rpx
;
.text-wrap
{
line-height
:
normal
;
color
:
#3d3d3d
;
overflow
:
hidden
;
max-height
:
86rpx
;
position
:
relative
;
.more
{
position
:
absolute
;
bottom
:
4rpx
;
right
:
0
;
line-height
:
1
.2em
;
background-color
:
#fff
;
color
:
#0974f5
;
}
}
.text
{
font-family
:
Source
Han
Sans
;
font-weight
:
500
;
...
...
src/pages/assistingAgriculture/order/detail.vue
View file @
9e429445
...
...
@@ -76,64 +76,55 @@
</view>
</view>
<view
class=
"product"
>
<view
class=
"header"
>
<view
class=
"header"
@
tap=
"toShopDetail()"
>
<view
class=
"icon"
>
物流
</view>
<text
class=
"title"
>
焗中焗盐焗鸡麻辣鸡
</text>
<text
class=
"title"
v-if=
"shopDetail"
>
{{
shopDetail
.
shopName
}}
</text>
</view>
<view
class=
"product-list"
>
<view
class=
"product-item"
>
<view
class=
"left"
>
<image
src=
"/static/ticket/logo.png"
class=
"img"
mode=
"aspectFill"
></image>
<view
class=
"infobox"
>
<view
class=
"name"
>
盐焗鸡
</view>
<view
class=
"num"
>
1斤
</view>
</view>
</view>
<view
class=
"right"
>
<view
class=
"textbox"
>
<text>
实付¥
</text>
<text
class=
"price"
>
48.00
</text>
</view>
<text
class=
"num"
>
x1
</text>
</view>
</view>
<view
class=
"product-item"
v-if=
"showMore"
>
<view
class=
"left"
>
<image
src=
"/static/ticket/logo.png"
class=
"img"
mode=
"aspectFill"
></image>
<view
class=
"infobox"
>
<view
class=
"name"
>
盐焗鸡
</view>
<view
class=
"num"
>
1斤
</view>
<view
class=
"product-list"
v-if=
"orderDetail"
>
<view
class=
"product-item"
v-for=
"(item, index) in orderDetail.orderItems"
:key=
"index"
@
tap=
"toProdDetail(item.prodId)"
>
<block
v-if=
"index == 0 || showMore"
>
<view
class=
"left"
>
<image
:src=
"fileDomain + item.pic"
class=
"img"
mode=
"aspectFill"
></image>
<view
class=
"infobox"
>
<view
class=
"name"
>
{{
item
.
prodName
}}
</view>
<view
class=
"num"
>
{{
item
.
skuName
}}
</view>
</view>
</view>
</view>
<view
class=
"right"
>
<view
class=
"textbox"
>
<text>
实付¥
</text>
<text
class=
"price"
>
48.00
</text>
<view
class=
"right"
>
<view
class=
"textbox"
>
<text>
实付¥
</text>
<text
class=
"price"
>
{{
item
.
actualTotal
}}
</text>
</view>
<text
class=
"num"
>
x
{{
item
.
prodCount
}}
</text>
</view>
<text
class=
"num"
>
x1
</text>
</view>
</block>
</view>
</view>
<view
class=
"totalbox totalbox-line"
v-if=
"showMore"
>
<view
class=
"total-item"
>
<text>
商品总价:
</text>
<text>
¥
98.70
</text>
<text>
¥
{{
orderDetail
.
orderLogistics
.
total
}}
</text>
</view>
<view
class=
"total-item"
>
<text>
运费:
</text>
<text>
¥
10.00
</text>
<text>
¥
{{
orderDetail
.
orderLogistics
.
freightFee
}}
</text>
</view>
<view
class=
"total-item"
>
<text>
店铺优惠:
</text>
<text>
¥
0.00
</text>
<text>
¥
{{
orderDetail
.
orderLogistics
.
reduceAmount
}}
</text>
</view>
<view
class=
"total-item"
>
<text>
实付
</text>
<view
class=
"pricebox"
>
<text
class=
"text"
>
共2件 合计:
</text>
<text
class=
"icon"
>
¥
</text>
<text
class=
"price"
>
108.
</text>
<
text
class=
"icon"
>
70
</text
>
<text
class=
"price"
>
{{
orderDetail
.
orderLogistics
.
actualTotal
}}
</text>
<
!--
<text
class=
"icon"
>
{{
orderDetail
.
orderLogistics
.
actualTotal
.
split
(
'.'
)[
1
]
}}
</text>
--
>
</view>
</view>
</view>
...
...
@@ -141,19 +132,19 @@
<text
class=
"title"
>
订单信息
</text>
<view
class=
"total-item"
>
<text>
订单号:
</text>
<text>
5555222222111111
</text>
<text>
{{
orderDetail
.
orderLogistics
.
orderNumber
.
slice
(
6
)
}}
</text>
</view>
<view
class=
"total-item"
>
<text>
运费:
</text>
<text>
¥
10.00
</text>
<text>
¥
{{
orderDetail
.
orderLogistics
.
freightFee
}}
</text>
</view>
<view
class=
"total-item"
>
<text>
下单时间:
</text>
<text>
2024-05-22 17:25:54
</text>
<text>
{{
orderDetail
.
orderLogistics
.
createTime
}}
</text>
</view>
<view
class=
"total-item"
>
<text>
支付方式:
</text>
<text>
微信
</text>
<text>
{{
payWayList
[
orderDetail
.
orderLogistics
.
payWay
]
}}
</text>
</view>
</view>
<view
class=
"more"
@
tap=
"changeShowMore"
>
...
...
@@ -180,6 +171,51 @@
<
script
setup
>
import
Header
from
'@/pages/order/components/Header/index.vue'
;
import
stepBar
from
'@/pages/assistingAgriculture/order/components/stepBar/index.vue'
;
import
{
getOrderDetail
,
getShopDetail
}
from
'@/api/order'
;
const
fileDomain
=
import
.
meta
.
env
.
VITE_APP_IMG_URL
;
const
orderNumber
=
ref
(
''
);
onLoad
((
options
)
=>
{
orderNumber
.
value
=
options
.
orderNumber
;
getDetail
();
});
const
payWayList
=
ref
({
0
:
'翼支付'
,
1
:
'支付宝'
,
2
:
'微信'
,
});
/**
* 获取订单详情 0-翼支付,1-支付宝,2-微信
*/
const
orderDetail
=
ref
();
const
getDetail
=
async
()
=>
{
const
res
=
await
getOrderDetail
({
orderNumber
:
orderNumber
.
value
});
orderDetail
.
value
=
res
.
data
;
getShopMailDetail
(
orderDetail
.
value
.
baseOrder
.
shopId
);
};
/**
* 获取商铺信息
*/
const
shopDetail
=
ref
();
const
getShopMailDetail
=
async
(
id
)
=>
{
const
res
=
await
getShopDetail
({
shopId
:
id
});
shopDetail
.
value
=
res
.
data
.
shop
;
};
const
toShopDetail
=
()
=>
{
xma
.
navigateTo
({
url
:
`/pages/assistingAgriculture/shop/index?shopId=
${
shopDetail
.
value
.
shopId
}
`
,
});
};
const
toProdDetail
=
(
id
)
=>
{
xma
.
navigateTo
({
url
:
`/pages/assistingAgriculture/detail/detail?prodId=
${
id
}
`
,
});
};
const
showMore
=
ref
(
false
);
const
changeShowMore
=
()
=>
{
...
...
src/pages/assistingAgriculture/reviewDetails/reviewDetails.vue
View file @
9e429445
...
...
@@ -3,7 +3,7 @@
<view
class=
"review-details-pages"
>
<view
class=
"swiper-list"
>
<wd-swiper
:list=
"
swiperList
"
:list=
"
reviewDetail.orderEvaluation?.images
"
direction=
"horizontal"
indicatorPosition=
"right"
autoplay
...
...
@@ -22,46 +22,46 @@
<view
class=
"revuew-content"
>
<view
class=
"user-info"
>
<view
class=
"info-content"
>
<image
src=
"@/static/assistingAgriculture/reviewDetails/avatar.png"
mode=
"aspectFill"
></image>
<image
:src=
"imgUrl + reviewDetail.user?.avatar"
mode=
"aspectFill"
></image>
<view
class=
"text-box"
>
<text
class=
"user-name"
>
不爱吃鱼的小猫咪
</text>
<text
class=
"fb-time"
>
2024-08-03
</text>
<text
class=
"user-name"
>
{{ reviewDetail.user.nickName }}
</text>
<text
class=
"fb-time"
>
{{ reviewDetail.user.createTime }}
</text>
</view>
</view>
<view>
<text
class=
"score"
>
4.9
</text>
<text
class=
"score"
>
{{ reviewDetail.orderEvaluation?.descriptionMatches }}
</text>
<text
class=
"score-unit"
>
/5分
</text>
</view>
</view>
<text
style=
"margin-top: 12rpx; font-size: 14 * 2rpx; color: #3d3d3d"
>
跟团游行程紧凑有序,充分利用了时间,让游客能够在有限的时间内充分游览黄果树的主要景点,如黄果树大瀑布、陡坡塘瀑布、天星桥景区等,不留遗憾。导游专业且热情,对景区有深入的了解,能够生动有趣地讲解景点的历史、文化和特色,同时耐心解答问题。
跟团游行程紧凑有序,充分利用了时间,让游客能够在有限的时间内充分游览黄果树的主要景点,如黄果树大瀑布、陡坡塘瀑布、天星桥景区等,不留遗憾。导游专业且热情,对景区有深入的了解,能够生动有趣地讲解景点的历史、文化和特色,同时耐心解答问题。
<text
style=
"margin-top: 12rpx; font-size: 14 * 2rpx; color: #3d3d3d; text-align: left"
>
{{ reviewDetail.orderEvaluation.evaluation }}
</text>
</view>
<view
class=
"scenic-spot"
>
<image
src=
"@/static/assistingAgriculture/reviewDetails/fj.png
"
mode=
"aspectFill"
></image>
<view
class=
"scenic-spot"
@
click=
"jumpProd"
>
<image
:src=
"imgUrl + prodInfo.pic
"
mode=
"aspectFill"
></image>
<view
class=
"scenic-area-details"
>
<text
class=
"scenic-name"
>
红枫湖+青岩古镇+云漫湖
</text>
<text
class=
"scenic-type"
>
自然风景
</text>
<text
class=
"scenic-name"
>
{{ prodInfo.prodName }}
</text>
<text
class=
"scenic-type"
>
{{ prodInfo.brief }}
</text>
<view
class=
"tag-list"
>
<text
class=
"tag"
>
无购物
</text>
<text
class=
"tag"
>
无购物
</text>
<!-- <text class="tag">{{ prodInfo.brief }}</text> -->
</view>
</view>
<wd-icon
class=
"icon"
color=
"#ABAAAA"
name=
"arrow-right"
size=
"22px"
></wd-icon>
</view>
<view
class=
"dz-btn"
>
<wd-icon
color=
"#767676"
name=
"thumb-up"
size=
"22px"
></wd-icon>
<text>
12
</text>
<view
class=
"dz-btn"
@
click=
"dzClick"
>
<wd-icon
v-if=
"reviewDetail.isLike == 0"
name=
"thumb-up"
size=
"44rpx"
></wd-icon>
<wd-icon
v-else
name=
"thumb-up"
color=
"red"
size=
"44rpx"
></wd-icon>
<text>
{{ reviewDetail.likeNum }}
</text>
</view>
</view>
</template>
<
script
setup
>
import
{
evaluationGetById
,
prodGetProd
}
from
'@/api/assistingAgriculture/reviewDetails'
;
import
{
likeOrDislike
}
from
'@/api/shop'
;
const
current
=
ref
(
0
);
const
imgUrl
=
import
.
meta
.
env
.
VITE_APP_IMG_URL
;
const
evaluationIds
=
ref
(
''
);
onMounted
(()
=>
{
xma
.
getSystemInfo
({
success
:
function
(
res
)
{
...
...
@@ -69,15 +69,59 @@ onMounted(() => {
},
});
});
const
swiperList
=
ref
([
'https://registry.npmmirror.com/wot-design-uni-assets/*/files/redpanda.jpg'
,
'https://registry.npmmirror.com/wot-design-uni-assets/*/files/capybara.jpg'
,
'https://registry.npmmirror.com/wot-design-uni-assets/*/files/panda.jpg'
,
]
);
onLoad
((
options
)
=>
{
const
{
evaluationId
}
=
options
;
evaluationIds
.
value
=
evaluationId
;
evaluationGetByIdFn
(
evaluationId
);
}
);
function
handleClick
(
e
)
{}
function
onChange
(
e
)
{
console
.
log
(
e
);
}
const
prodInfo
=
ref
({});
function
prodGetProdFn
(
prodId
)
{
prodGetProd
({
prodId
}).
then
((
res
)
=>
{
prodInfo
.
value
=
res
.
data
.
data
.
prod
;
});
}
const
reviewDetail
=
ref
({});
const
jumpProd
=
()
=>
{
xma
.
navigateTo
({
url
:
`/pages/assistingAgriculture/RouteDetails/RouteDetails?prodId=
${
prodInfo
.
value
.
prodId
}
&shopId=
${
prodInfo
.
value
.
shopId
}
`
,
});
};
const
dzClick
=
()
=>
{
likeOrDislike
({
evaluationId
:
evaluationIds
.
value
}).
then
((
res
)
=>
{
if
(
res
.
code
===
0
)
{
if
(
reviewDetail
.
value
.
isLike
===
0
)
{
reviewDetail
.
value
.
likeNum
++
;
reviewDetail
.
value
.
isLike
=
1
;
}
else
{
reviewDetail
.
value
.
likeNum
--
;
reviewDetail
.
value
.
isLike
=
0
;
}
}
});
};
function
evaluationGetByIdFn
(
evaluationId
)
{
evaluationGetById
({
evaluationId
}).
then
((
res
)
=>
{
if
(
res
.
code
===
0
)
{
if
(
res
.
data
.
orderEvaluation
.
images
)
{
res
.
data
.
orderEvaluation
.
images
=
res
.
data
.
orderEvaluation
.
images
.
split
(
','
)
.
map
((
item
)
=>
{
item
=
import
.
meta
.
env
.
VITE_APP_IMG_URL
+
item
;
return
item
;
})
.
filter
((
item
)
=>
{
return
item
&&
item
!==
''
;
});
}
reviewDetail
.
value
=
res
.
data
;
prodGetProdFn
(
res
.
data
.
orderEvaluation
.
prodId
);
}
});
}
</
script
>
<
style
lang=
"scss"
scoped
>
...
...
@@ -109,7 +153,6 @@ page {
display
:
flex
;
flex-direction
:
column
;
width
:
100%
;
align-items
:
center
;
padding
:
40rpx
20rpx
;
box-sizing
:
border-box
;
.user-info
{
...
...
src/pages/assistingAgriculture/reviewDetails/scenicSpotDetails.vue
View file @
9e429445
...
...
@@ -2,13 +2,13 @@
<!-- 点评详情页面 -->
<view
class=
"review-details-pages"
>
<view
class=
"list"
>
<view
class=
"item"
v-for=
"
i in 10"
:key=
"i
"
>
<image
mode=
"aspectFill"
src=
"@/static/assistingAgriculture/reviewDetails/fj.png
"
></image>
<view
class=
"item"
v-for=
"
(item, index) in list"
:key=
"index
"
>
<image
mode=
"aspectFill"
:src=
"imgUrl + item.pic
"
></image>
<view
class=
"info-box"
>
<text>
红枫湖景区
</text>
<text>
自然风景
</text>
<text
class=
"t-2"
>
4.5
分
</text>
<text
class=
"t-2"
>
门票费用已包含
</text>
<text>
{{
item
.
attractionName
}}
</text>
<text>
{{
item
.
resourceType
}}
</text>
<text
class=
"t-2"
>
{{
item
.
score
}}
分
</text>
<text
class=
"t-2"
v-if=
"item.isTicket === 1"
>
门票费用已包含
</text>
</view>
</view>
</view>
...
...
@@ -16,7 +16,22 @@
</
template
>
<
script
setup
>
onMounted
(()
=>
{});
import
{
znprodTourList
}
from
'@/api/assistingAgriculture/scenicSpotDetails'
;
const
prodIds
=
ref
(
''
);
const
list
=
ref
([]);
const
imgUrl
=
import
.
meta
.
env
.
VITE_APP_IMG_URL
;
onLoad
((
options
)
=>
{
const
{
prodId
}
=
options
;
prodIds
.
value
=
prodId
;
znprodTourListFn
(
prodId
);
});
const
znprodTourListFn
=
(
prodId
)
=>
{
znprodTourList
({
prodId
}).
then
((
res
)
=>
{
if
(
res
.
code
===
0
)
{
list
.
value
=
res
.
data
;
}
});
};
</
script
>
<
style
lang=
"scss"
scoped
>
...
...
src/pages/index/index.vue
View file @
9e429445
...
...
@@ -14,7 +14,7 @@
v-for=
"(item, index) in classificationT"
:key=
"index"
>
<image
class=
"imgs"
:src=
"item.icon"
mode=
"widthFix"
/>
<image
class=
"imgs"
:src=
"item.icon"
/>
<text
class=
"introduce"
>
{{
item
.
categoryName
}}
</text>
</view>
</view>
...
...
@@ -25,7 +25,7 @@
v-for=
"(item, index) in classificationB"
:key=
"index"
>
<image
class=
"imgs"
:src=
"item.icon"
mode=
"widthFix"
/>
<image
class=
"imgs"
:src=
"item.icon"
/>
<text
class=
"introduce"
>
{{
item
.
categoryName
}}
</text>
</view>
</view>
...
...
@@ -150,28 +150,12 @@
>
没有更多啦~
</view>
<!-- 悬浮按钮 -->
<wd-fab
type=
"error"
position=
"right-bottom"
direction=
"left"
:draggable=
"true"
inactiveIcon=
"a-controlplatform"
>
<view
class=
"custom-button"
@
click=
"go('/pages/ticket/ticket')"
>
<image
class=
"fab-icon"
src=
"@/static/index/coupon.png"
></image>
<text
class=
"fab-text"
>
优惠券
</text>
</view>
<view
class=
"custom-button"
@
click=
"go('/pages/order/order')"
>
<image
class=
"fab-icon"
src=
"@/static/index/order.png"
></image>
<text
class=
"fab-text"
>
订单
</text>
</view>
</wd-fab>
<fab
/>
</view>
</
template
>
<
script
setup
>
import
fab
from
'../../components/fab/fab.vue'
;
import
myIcon
from
'../../components/wd-icon-local/wd-icon.vue'
;
import
{
onMounted
,
reactive
,
ref
}
from
'vue'
;
import
{
useCountStore
}
from
'@/store'
;
...
...
@@ -526,13 +510,6 @@ onReachBottom(() => {
}
show
.
value
=
true
;
});
// 前往个人中心
const
go
=
(
url
)
=>
{
xma
.
navigateTo
({
url
,
});
};
</
script
>
<
style
lang=
"scss"
scoped
>
...
...
@@ -564,7 +541,7 @@ page {
display
:
flex
;
justify-content
:
space-evenly
;
margin-top
:
32rpx
;
align-items
:
center
;
align-items
:
flex-end
;
.choice
{
display
:
flex
;
flex-direction
:
column
;
...
...
@@ -577,6 +554,7 @@ page {
Source
Han
Sans
;
.imgs
{
width
:
88rpx
;
height
:
88rpx
;
}
}
}
...
...
@@ -584,7 +562,7 @@ page {
display
:
flex
;
justify-content
:
space-evenly
;
margin-top
:
34rpx
;
align-items
:
center
;
align-items
:
flex-end
;
.choice
{
display
:
flex
;
flex-direction
:
column
;
...
...
@@ -597,6 +575,7 @@ page {
Source
Han
Sans
;
.imgs
{
width
:
68rpx
;
height
:
68rpx
;
margin-bottom
:
8rpx
;
}
}
...
...
@@ -865,26 +844,5 @@ page {
}
}
}
.custom-button
{
min-width
:
auto
;
box-sizing
:
border-box
;
gap
:
10rpx
;
margin
:
8rpx
;
display
:
flex
;
flex-direction
:
column
;
align-items
:
center
;
justify-content
:
center
;
.fab-icon
{
width
:
64rpx
;
height
:
64rpx
;
}
.fab-text
{
font-size
:
20rpx
;
color
:
#333
;
}
}
}
</
style
>
src/pages/order/order.vue
View file @
9e429445
...
...
@@ -302,7 +302,7 @@ const catalog = reactive({
endDate
:
''
,
keyword
:
''
,
status
:
''
,
// 待付款-not_pay,待使用-not_use,待评价not_eval,退款-after_sales
orderType
:
'
store
'
,
// 团购到店-store,外卖订单-takeaway,筑农物流logistics
orderType
:
''
,
// 团购到店-store,外卖订单-takeaway,筑农物流logistics
});
const
getList
=
async
()
=>
{
if
(
isEnd
.
value
)
return
;
...
...
@@ -503,10 +503,13 @@ const onFinish = async (orderNumber) => {
const
handleDetail
=
(
item
)
=>
{
// 清空查询待付款状态
pendingPaymentOrder
.
value
=
null
;
console
.
log
(
item
.
orderType
);
if
(
item
.
orderType
===
'logistics'
)
{
console
.
log
(
1111
);
uni
.
navigateTo
({
url
:
`pages/assistingAgriculture/order/detail?orderNumber=
${
item
.
orderNumber
}
`
,
url
:
`
/
pages/assistingAgriculture/order/detail?orderNumber=
${
item
.
orderNumber
}
`
,
});
return
;
}
uni
.
navigateTo
({
url
:
`/pages/order/detail?orderNumber=
${
item
.
orderNumber
}
`
,
...
...
src/pages/packageDetails/packageDetails.vue
View file @
9e429445
...
...
@@ -918,6 +918,7 @@ page {
}
img
{
max-width
:
100%
;
object-fit
:
cover
;
height
:
auto
;
margin-top
:
20rpx
;
}
...
...
vite.config.ts
View file @
9e429445
...
...
@@ -35,7 +35,7 @@ export default defineConfig({
alias
:
{
'@'
:
path
.
resolve
(
__dirname
,
'./src'
),
},
},
},
server
:
{
open
:
true
,
// 代理配置
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment