Skip to content
Toggle navigation
Toggle navigation
This project
Loading...
Sign in
杨炀
/
ztx_wx_gzt
Go to a project
Toggle navigation
Toggle navigation pinning
Projects
Groups
Snippets
Help
Project
Activity
Repository
Pipelines
Graphs
Issues
0
Merge Requests
0
Wiki
Network
Create a new issue
Builds
Commits
Issue Boards
Files
Commits
Network
Compare
Branches
Tags
3dd81aba
authored
2026-03-23 18:04:14 +0800
by
lttnew
Browse Files
Options
Browse Files
Tag
Download
Email Patches
Plain Diff
接口修改
1 parent
58412f8a
Hide whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
383 additions
and
344 deletions
common/api.js
group/pay.vue
myCenter/chooseExaminer.vue
myCenter/goPay.vue
myCenter/payOrder.vue
myCenter/sucPay.vue
personalVip/addVip.vue
personalVip/payment.vue
personalVip/renew.vue
personalVip/vipList.vue
common/api.js
View file @
3dd81ab
...
...
@@ -747,7 +747,7 @@ export function delPayment(payIds) {
}
export
function
paymentDel
(
payIds
)
{
return
request
({
url
:
`/person/paymentRange/
${
payIds
}
`
,
url
:
`/person/paymentRange
New
/
${
payIds
}
`
,
method
:
'DELETE'
})
}
...
...
@@ -1303,7 +1303,14 @@ export function certifiedNew(params) {
// 模拟回调
export
function
callBack2
(
orderId
)
{
return
request
({
url
:
`/system/certifiedNew/callBack2/
${
orderId
}
`
url
:
`/system/certifiedNew/callBack2/
${
orderId
}
`
,
method
:
'get'
,
})
}
export
function
pcallBack2
(
orderId
)
{
return
request
({
url
:
`/person/paymentRangeNew/callBack2/
${
orderId
}
`
,
method
:
'get'
,
})
}
// 优惠政策回显
...
...
group/pay.vue
View file @
3dd81ab
<
template
>
<
template
>
<view>
<!-- 会员认证 -->
<view
class=
"searchbar"
>
...
...
@@ -6,96 +6,96 @@
v-model=
"queryParams.rangeName"
placeholder=
"缴费名称"
@
blur=
"getList"
@
clear=
"getList"
>
</uni-easyinput>
<view
class=
"invertedbtn-red"
v-if=
"userType=='2'"
@
click=
"goAddPay"
>
+ 新建缴费
</view>
</view>
<view
class=
"appList"
>
<view
class=
"appItem"
v-for=
"(item,index) in list"
:key=
"index"
>
<view
class=
"status"
@
click=
"goDetail(item)"
>
</view>
<view
class=
"appList"
>
<view
class=
"appItem"
v-for=
"(item,index) in list"
:key=
"index"
>
<view
class=
"status"
@
click=
"goDetail(item)"
>
<text
v-if=
"item?.content?.status==0"
class=
"text-primary"
>
待提交
</text>
<text
v-if=
"item?.content?.status==1"
class=
"text-primary"
>
审核中
</text>
<text
v-if=
"item?.content?.status==2"
class=
"text-success"
>
审核通过
</text>
<text
v-if=
"item?.content?.status==3"
class=
"text-danger"
>
审核拒绝
</text>
<text
v-if=
"item?.content?.status==4"
class=
"text-warning"
>
已撤回
</text>
<text
v-if=
"item?.content?.status==1"
class=
"text-primary"
>
审核中
</text>
<text
v-if=
"item?.content?.status==2"
class=
"text-success"
>
审核通过
</text>
<text
v-if=
"item?.content?.status==3"
class=
"text-danger"
>
审核拒绝
</text>
<text
v-if=
"item?.content?.status==4"
class=
"text-warning"
>
已撤回
</text>
</view>
<view
class=
"date"
>
{{
item
?.
content
?.
commitTime
}}
提交
</view>
<view
class=
"text-primary"
v-if=
"item.wfCode"
>
{{
item
.
wfCode
}}
</view>
<view
class=
"text-primary"
v-if=
"item.wfCode"
>
{{
item
.
wfCode
}}
</view>
<view
class=
"name mt0"
@
click=
"goDetail(item)"
>
{{
item
.
rangeName
}}
</view>
<view
class=
"flexbox"
@
click=
"goDetail(item)"
>
<view>
会员合计
<view>
{{
item
.
allCount
}}
</view>
</view>
<view
v-if=
"userType!='2'"
>
续费年限
<view>
{{
item
.
content
?.
renewYear
}}
</view>
</view>
<view
:class=
"userType=='2'?'w50':''"
>
年限合计
<view>
{{
item
.
totalRenewYear
}}
</view>
</view>
</view>
<view
class=
"func"
v-if=
"item.content?.status==0||item.content?.status==3||item.content?.status==4"
>
<view
class=
"flexbox"
@
click=
"goDetail(item)"
>
<view>
会员合计
<view>
{{
item
.
allCount
}}
</view>
</view>
<view
v-if=
"userType!='2'"
>
续费年限
<view>
{{
item
.
content
?.
renewYear
}}
</view>
</view>
<view
:class=
"userType=='2'?'w50':''"
>
年限合计
<view>
{{
item
.
totalRenewYear
}}
</view>
</view>
</view>
<view
class=
"func"
v-if=
"item.content?.status==0||item.content?.status==3||item.content?.status==4"
>
<button
@
click=
"handleDelete(item)"
>
删除
</button>
<button
@
click=
"handleUpdate(item)"
>
编辑
</button>
<button
@
click=
"commitFN(item)"
>
提交审核
</button>
</view>
</view>
</view>
<view
class=
"nodata"
v-if=
"list.length==0"
>
<image
mode=
"aspectFit"
src=
"/static/nodata.png"
></image>
<text>
暂无数据
</text>
</view>
</view>
</
template
>
<
script
setup
>
import
*
as
api
from
'@/common/api.js'
import
config
from
'@/config.js'
import
{
onMounted
,
ref
}
from
'vue'
import
{
onLoad
,
onShow
}
from
'@dcloudio/uni-app'
const
app
=
getApp
();
</view>
</view>
</view>
<view
class=
"nodata"
v-if=
"list.length==0"
>
<image
mode=
"aspectFit"
src=
"/static/nodata.png"
></image>
<text>
暂无数据
</text>
</view>
</view>
</
template
>
<
script
setup
>
import
*
as
api
from
'@/common/api.js'
import
config
from
'@/config.js'
import
{
onMounted
,
ref
}
from
'vue'
import
{
onLoad
,
onShow
}
from
'@dcloudio/uni-app'
const
app
=
getApp
();
const
list
=
ref
([])
const
queryParams
=
ref
({})
const
userType
=
ref
(
''
)
const
queryParams
=
ref
({})
const
userType
=
ref
(
''
)
const
UpPop
=
ref
(
null
)
const
form
=
ref
({
docId
:
''
,
payTime
:
''
,
url
:
''
,
remark
:
''
})
onShow
(()
=>
{
if
(
app
.
globalData
.
isLogin
)
{
init
()
}
else
{
app
.
firstLoadCallback
=
()
=>
{
init
()
};
}
})
function
init
()
{
userType
.
value
=
app
.
globalData
.
userType
getList
()
}
function
getList
()
{
})
onShow
(()
=>
{
if
(
app
.
globalData
.
isLogin
)
{
init
()
}
else
{
app
.
firstLoadCallback
=
()
=>
{
init
()
};
}
})
function
init
()
{
userType
.
value
=
app
.
globalData
.
userType
getList
()
}
function
getList
()
{
api
.
getPayList
(
queryParams
.
value
).
then
(
res
=>
{
for
(
const
item
of
res
.
rows
)
{
item
.
content
=
null
if
(
item
.
certList
?.
length
>
0
)
{
item
.
content
=
item
.
certList
[
0
]
}
}
list
.
value
=
res
.
rows
})
}
}
list
.
value
=
res
.
rows
})
}
function
commitFN
(
row
)
{
uni
.
showModal
({
title
:
'提示'
,
...
...
@@ -109,16 +109,16 @@
})
}
})
}
function
goDetail
(
item
)
{
}
function
goDetail
(
item
)
{
//详情
const
form
=
encodeURIComponent
(
JSON
.
stringify
(
item
))
// 查看
let
path
=
`/group/payDetail?&form=
${
form
}
`
uni
.
navigateTo
({
url
:
path
});
});
}
function
goAddPay
(){
...
...
@@ -147,9 +147,9 @@
url
:
path
});
}
</
script
>
</
script
>
<
style
scoped
lang=
"scss"
>
.searchbar
{
display
:
flex
;
...
...
@@ -174,15 +174,15 @@
font-size
:
30
rpx
;
padding
:
10
rpx
20
rpx
;
}
}
.popBody
{
font-size
:
28
rpx
;
line-height
:
1.5
;
overflow
:
auto
;
padding
:
30
rpx
;
.btn-red
{
margin
:
50
rpx
0
30
rpx
;
}
}
}
.popBody
{
font-size
:
28
rpx
;
line-height
:
1.5
;
overflow
:
auto
;
padding
:
30
rpx
;
.btn-red
{
margin
:
50
rpx
0
30
rpx
;
}
}
</
style
>
\ No newline at end of file
...
...
myCenter/chooseExaminer.vue
View file @
3dd81ab
...
...
@@ -195,10 +195,11 @@ async function confirmAddExpireExaminer() {
.search-buttons
{
display
:
flex
;
justify-content
:
space-between
;
margin-top
:
10
rpx
;
margin-top
:
30
rpx
;
margin-left
:
80px
;
}
.search-btn
,
.reset-btn
{
width
:
2
0
0
rpx
;
width
:
2
2
0
rpx
;
height
:
70
rpx
;
line-height
:
70
rpx
;
border-radius
:
8
rpx
;
...
...
myCenter/goPay.vue
View file @
3dd81ab
<
template
>
<view
class=
"container"
>
<!-- 主内容区域 -->
<view
class=
"content"
>
<!-- 缴费年限 + 费用卡片 -->
<view
class=
"card"
>
<!-- 缴费年限 -->
<view
class=
"yearRow"
>
<view
class=
"label"
>
缴费年限
</view>
<view
class=
"control"
>
...
...
@@ -112,9 +109,9 @@ const handelPay = async () => {
})
}
else
{
if
(
data
.
orderId
)
{
a
wait
callBack2
(
data
.
orderId
)
a
pi
.
callBack2
(
data
.
orderId
)
uni
.
navigateTo
({
url
:
`/myCenter/
go
Pay`
url
:
`/myCenter/
suc
Pay`
})
}
...
...
myCenter/payOrder.vue
View file @
3dd81ab
...
...
@@ -93,18 +93,18 @@ async function handlePay() {
payLoading
.
value
=
true
const
res
=
await
api
.
goPay
(
rangeId
.
value
)
// 订单ID存在则调用回调接口
if
(
res
.
data
?.
orderId
)
{
await
api
.
callBack2
(
res
.
data
.
orderId
)
api
.
pcallBack2
(
res
.
data
.
orderId
)
uni
.
navigateTo
({
url
:
`/myCenter/sucPay?rangeId=
${
rangeId
.
value
}
from=payOrder`
})
}
// 跳转到支付成功页
uni
.
navigateTo
({
url
:
`/pages/payOk/payOk?rangeId=
${
rangeId
.
value
}
`
})
}
catch
(
err
)
{
cons
ole
.
error
(
'支付失败:'
,
err
)
uni
.
showToast
({
title
:
err
.
data
.
m
sg
,
icon
:
'none'
})
cons
t
errMsg
=
err
?.
data
?.
msg
||
err
?.
message
||
'支付失败,请稍后重试'
uni
.
showToast
({
title
:
err
M
sg
,
icon
:
'none'
})
}
finally
{
payLoading
.
value
=
false
}
...
...
myCenter/sucPay.vue
View file @
3dd81ab
...
...
@@ -41,23 +41,30 @@
<!-- 确定按钮(渐变+动效) -->
<view
class=
"confirm-btn-area"
>
<button
class=
"confirm-btn"
@
click=
"
handleConfirm
"
>
确定
</button>
<button
class=
"confirm-btn"
@
click=
"
goBack
"
>
确定
</button>
</view>
</view>
</
template
>
<
script
setup
>
import
{
onLoad
}
from
'@dcloudio/uni-app'
const
goBack
=
()
=>
{
const
pages
=
getCurrentPages
()
const
currentPage
=
pages
[
pages
.
length
-
1
]
const
{
from
}
=
currentPage
.
options
||
{}
// 确定按钮点击事件
const
handleConfirm
=
()
=>
{
uni
.
navigateBack
({
delta
:
1
})
// 也可跳转首页:uni.redirectTo({ url: '/pages/index/index' })
let
delta
=
1
if
(
from
===
'payOrder'
)
{
delta
=
2
// 来自添加会员 / 订单页 → 返回 2 级
}
else
{
delta
=
3
}
uni
.
navigateBack
({
delta
})
}
onLoad
((
option
)
=>
{
// 可接收订单参数动态渲染,示例:
// if (option.amount) { /* 赋值给金额变量 */ }
})
</
script
>
...
...
personalVip/addVip.vue
View file @
3dd81ab
...
...
@@ -67,11 +67,7 @@
<image
mode=
"aspectFill"
v-if=
"baseFormData.photo2"
style=
"height:200rpx;width:200rpx;"
:src=
"config.baseUrl_api + baseFormData.photo2"
/>
</uni-forms-item>
</view>
</uni-forms>
</view>
<view
class=
"agreeline"
>
<image
@
click=
"changeAgree(agree)"
v-if=
"agree"
...
...
@@ -84,7 +80,7 @@
<view
class=
"fixedBottom"
><button
class=
"btn-red"
@
click=
"goSubmit"
>
确 定
</button></view>
<!-- 会员须知 -->
<uni-popup
ref=
"popup"
type=
"bottom"
background-color=
"#fff"
animation
>
<uni-popup
ref=
"popup"
type=
"bottom"
background-color=
"#fff"
animation
:disable-scroll=
"true"
:mask-click=
"false"
>
<view
class=
"tt"
>
入会须知
</view>
<view
class=
"popBody"
>
_
{{
baseFormData
.
name
}}
_欢迎您申请成为中国跆拳道协会(以下简称中国跆协)会员,请确保本次申请是经过您本人或监护人授权同意后的自愿行为,请您务必仔细阅读本入会须知。
...
...
@@ -106,7 +102,7 @@
</view>
</uni-popup>
<uni-popup
ref=
"infoConfirm"
type=
"center"
>
<uni-popup
ref=
"infoConfirm"
type=
"center"
:disable-scroll=
"true"
:mask-click=
"false"
>
<view
class=
"tt"
>
确认信息
</view>
<view
class=
"popBody"
>
<view>
...
...
@@ -504,7 +500,6 @@
const
time
=
new
Date
().
valueOf
()
+
''
baseFormData
.
value
.
t
=
time
+
Math
.
floor
(
Math
.
random
()
*
10
)
baseFormData
.
value
.
signT
=
aes2
.
AESEncrypt
(
baseFormData
.
value
.
idcType
+
time
)
console
.
log
(
baseFormData
.
value
)
api
.
addPersonToMyDept
(
baseFormData
.
value
).
then
(
Response
=>
{
if
(
Response
.
data
==
0
)
{
let
msg
=
'该成员,实名认证未通过,注册失败!'
...
...
@@ -573,6 +568,7 @@
align-items
:
center
!important
;
justify-content
:
flex-end
!important
;
text-align
:
right
!important
;
flex-wrap
:
nowrap
!important
;
}
/* 输入框内容右对齐 */
...
...
@@ -587,18 +583,24 @@
/* 文本内容右对齐 */
.uni-forms-item
.uni-forms-item__content
text
,
.uni-forms-item
.uni-forms-item__content
>
text
{
text-align
:
right
!important
;
width
:
100%
;
display
:
block
;
display
:
inline-block
!important
;
white-space
:
nowrap
!important
;
}
/* 覆盖原有样式 */
:deep
(
.uni-forms-item__content
)
{
justify-content
:
flex-end
!important
;
}
</
style
>
<
style
lang=
"scss"
scoped
>
:deep
(
.uni-popup__mask
)
{
overflow
:
hidden
!important
;
position
:
fixed
!important
;
top
:
0
;
left
:
0
;
right
:
0
;
bottom
:
0
;
}
:deep
(
.uni-popup
)
{
overflow
:
hidden
!important
;
}
:deep
(
.segmented-control
)
{
height
:
100
rpx
;
}
...
...
@@ -617,6 +619,8 @@
.popBody
{
font-size
:
28
rpx
;
line-height
:
1.5
;
height
:
70vh
;
overflow-y
:
auto
;
font-family
:
华文仿宋
;
height
:
80vh
;
overflow
:
auto
;
...
...
@@ -632,6 +636,7 @@
box-sizing
:
border-box
;
display
:
flex
;
font-size
:
30
rpx
;
text
{
color
:
#014A9F
;
...
...
@@ -671,4 +676,13 @@
:deep
(
.item-text-overflow
)
{
text-align
:
left
;
}
:deep
(
.fixUniFormItemStyle
.uni-data-picker__input-box
)
{
justify-content
:
flex-start
!important
;
text-align
:
left
!important
;
}
/* 让地区选择器的文本左对齐 */
:deep
(
.fixUniFormItemStyle
.uni-data-picker__text
)
{
text-align
:
left
!important
;
}
</
style
>
\ No newline at end of file
...
...
personalVip/payment.vue
View file @
3dd81ab
<
template
>
<!-- 根容器:弹窗时强制固定定位,彻底锁死滚动 -->
<view
class=
"container"
:class=
"
{ 'lock-scroll': showModal }">
<!-- 搜索栏 -->
<view
class=
"search-bar"
>
<uni-easyinput
class=
"search-input"
placeholderStyle=
"font-size:30rpx;color:#999"
:input-border=
"false"
prefixIcon=
"search"
v-model=
"queryParams.memName"
placeholder=
"搜索缴费名称"
@
blur=
"getList"
@
clear=
"getList"
>
</uni-easyinput>
<view
class=
"add-btn"
@
click=
"goAdd"
>
<text
class=
"add-icon"
>
+
</text>
<text
class=
"add-text"
>
新建缴费
</text>
<!-- 固定顶部:搜索栏 + 状态Tab -->
<view
class=
"fixed-header-wrapper"
>
<!-- 搜索栏 -->
<view
class=
"search-bar"
>
<uni-easyinput
class=
"search-input"
placeholderStyle=
"font-size:30rpx;color:#999"
:input-border=
"false"
prefixIcon=
"search"
v-model=
"queryParams.memName"
placeholder=
"搜索缴费名称"
@
blur=
"getList"
@
clear=
"getList"
>
</uni-easyinput>
<view
class=
"add-btn"
@
click=
"goAdd"
>
<text
class=
"add-icon"
>
+
</text>
<text
class=
"add-text"
>
新建缴费
</text>
</view>
</view>
</view>
<!-- 1. 新增:审核状态筛选 Tab -->
<view
class=
"status-tabs"
>
<view
class=
"tab-item"
:class=
"
{ active: activeTab === '' }" @click="switchTab('')">全部
</view>
<view
class=
"tab-item"
:class=
"
{ active: activeTab === 0 }" @click="switchTab(0)">待提交
</view>
<view
class=
"tab-item"
:class=
"
{ active: activeTab === 1 }" @click="switchTab(1)">审核中
</view>
<view
class=
"tab-item"
:class=
"
{ active: activeTab === 2 }" @click="switchTab(2)">审核通过
</view>
<view
class=
"tab-item"
:class=
"
{ active: activeTab === 3 }" @click="switchTab(3)">审核拒绝
</view>
<!-- 审核状态筛选 Tab -->
<view
class=
"status-tabs"
>
<view
class=
"tab-item"
:class=
"
{ active: activeTab === '' }" @click="switchTab('')">全部
</view>
<view
class=
"tab-item"
:class=
"
{ active: activeTab === 0 }" @click="switchTab(0)">待提交
</view>
<view
class=
"tab-item"
:class=
"
{ active: activeTab === 1 }" @click="switchTab(1)">审核中
</view>
<view
class=
"tab-item"
:class=
"
{ active: activeTab === 2 }" @click="switchTab(2)">审核通过
</view>
<view
class=
"tab-item"
:class=
"
{ active: activeTab === 3 }" @click="switchTab(3)">审核拒绝
</view>
</view>
</view>
<!-- 会员缴费列表 -->
<view
class=
"list-container"
v-if=
"list.length > 0"
>
<view
class=
"list-item"
v-for=
"(item, index) in list"
:key=
"index"
@
click=
"goDetail(item)"
>
<view
class=
"item-header"
>
<view
class=
"left-info"
>
<text
class=
"mem-name"
>
{{
item
.
memName
}}
</text>
<text
class=
"wf-code"
v-if=
"item.wfCode"
>
{{
item
.
wfCode
}}
</text>
</view>
<view
class=
"status-badge"
:class=
"getStatusClass(item.auditStatus)"
>
{{
getStatusText
(
item
.
auditStatus
)
}}
<!-- 内容区域:自动滚动(顶部留出固定栏高度) -->
<view
class=
"scroll-content"
>
<!-- 会员缴费列表 -->
<view
class=
"list-container"
v-if=
"list.length > 0"
>
<view
class=
"list-item"
v-for=
"(item, index) in list"
:key=
"index"
@
click=
"goDetail(item)"
>
<view
class=
"item-header"
>
<view
class=
"left-info"
>
<text
class=
"mem-name"
>
{{
item
.
memName
}}
</text>
<text
class=
"wf-code"
v-if=
"item.wfCode"
>
{{
item
.
wfCode
}}
</text>
</view>
<view
class=
"status-badge"
:class=
"getStatusClass(item.auditStatus)"
>
{{
getStatusText
(
item
.
auditStatus
)
}}
</view>
</view>
</view>
<view
class=
"stats-row"
>
<view
class=
"stat-item"
>
<text
class=
"stat-label"
>
人数合计
</text>
<text
class=
"stat-value"
>
{{
item
.
allCount
||
0
}}
</text>
<view
class=
"stats-row"
>
<view
class=
"stat-item"
>
<text
class=
"stat-label"
>
人数合计
</text>
<text
class=
"stat-value"
>
{{
item
.
allCount
||
0
}}
</text>
</view>
<view
class=
"stat-item"
>
<text
class=
"stat-label"
>
新会员合计
</text>
<text
class=
"stat-value"
>
{{
item
.
newCount
||
0
}}
</text>
</view>
<view
class=
"stat-item"
>
<text
class=
"stat-label"
>
年限合计
</text>
<text
class=
"stat-value"
>
{{
item
.
yearCount
||
0
}}
</text>
</view>
</view>
<view
class=
"stat-item"
>
<text
class=
"stat-label"
>
新会员合计
</text>
<text
class=
"stat-value"
>
{{
item
.
newCount
||
0
}}
</text>
<view
class=
"submit-time"
v-if=
"item.commitTime"
>
<uni-icons
type=
"calendar-filled"
size=
"16"
color=
"#AD181F"
></uni-icons>
<text
class=
"time-text"
>
{{
item
.
commitTime
}}
提交
</text>
</view>
<view
class=
"stat-item"
>
<text
class=
"stat-label"
>
年限合计
</text>
<text
class=
"stat-value"
>
{{
item
.
yearCount
||
0
}}
</text>
<view
class=
"action-buttons"
>
<button
class=
"action-btn delete-btn"
@
click
.
stop=
"handleDel(item)"
:disabled=
"item.auditStatus == 1 || item.auditStatus == 9"
>
删除
</button>
<button
class=
"action-btn edit-btn"
@
click
.
stop=
"handleUpdate(item)"
:disabled=
"item.auditStatus != 0"
>
编辑
</button>
<button
class=
"action-btn submit-btn"
@
click
.
stop=
"commitFN(item)"
:disabled=
"item.auditStatus != 0"
>
提交审核
</button>
</view>
</view>
<view
class=
"submit-time"
v-if=
"item.commitTime"
>
<uni-icons
type=
"calendar-filled"
size=
"16"
color=
"#AD181F"
></uni-icons>
<text
class=
"time-text"
>
{{
item
.
commitTime
}}
提交
</text>
<view
class=
"load-more"
v-if=
"hasMore"
>
<text
class=
"load-text"
>
加载中...
</text>
</view>
<view
class=
"action-buttons"
>
<button
class=
"action-btn delete-btn"
@
click
.
stop=
"handleDel(item)"
:disabled=
"item.auditStatus == 1 || item.auditStatus == 9"
>
删除
</button>
<button
class=
"action-btn edit-btn"
@
click
.
stop=
"handleUpdate(item)"
:disabled=
"item.auditStatus != 0"
>
编辑
</button>
<button
class=
"action-btn submit-btn"
@
click
.
stop=
"commitFN(item)"
:disabled=
"item.auditStatus != 0"
>
提交审核
</button>
<view
class=
"load-more"
v-else-if=
"list.length > 0"
>
<text
class=
"load-text"
>
没有更多数据了
</text>
</view>
</view>
</view>
<!-- 空数据状态 -->
<view
class=
"empty-state"
v-else
>
<image
mode=
"aspectFit"
src=
"/static/nodata.png"
class=
"empty-icon"
></image>
<text
class=
"empty-text"
>
暂无数据
</text>
<!-- 空数据状态 -->
<view
class=
"empty-state"
v-else
>
<image
mode=
"aspectFit"
src=
"/static/nodata.png"
class=
"empty-icon"
></image>
<text
class=
"empty-text"
>
暂无数据
</text>
</view>
</view>
<!-- 弹窗 -->
<view
class=
"modal-mask"
v-show=
"showModal"
...
...
@@ -102,7 +117,7 @@
@
click
.
stop
@
touchmove
.
stop
.
prevent=
"() =>
{}"
>
<view
class=
"modal-title"
>
提示
</view>
<view
class=
"modal-title"
>
提示
</view>
<view
class=
"modal-con"
>
{{
modalTitle
}}
</view>
<view
class=
"modal-buttons"
>
<view
class=
"btn-cancel"
@
click=
"closeModal"
>
取消
</view>
...
...
@@ -117,18 +132,27 @@
import
*
as
api
from
'@/common/api.js'
import
config
from
'@/config.js'
import
{
ref
,
onUnmounted
}
from
'vue'
import
{
onLoad
,
onShow
,
onReady
}
from
'@dcloudio/uni-app'
import
{
onLoad
,
onShow
,
onReady
,
onReachBottom
}
from
'@dcloudio/uni-app'
const
queryParams
=
ref
({})
const
list
=
ref
([])
const
total
=
ref
(
0
)
// 新增:状态 Tab 激活项
const
activeTab
=
ref
(
''
)
// ========== 1. 彻底解决弹窗默认显示 ==========
let
showModal
=
ref
(
false
)
// ========== 分页参数 ==========
const
pageNum
=
ref
(
1
)
const
pageSize
=
ref
(
10
)
const
hasMore
=
ref
(
true
)
const
loading
=
ref
(
false
)
// ========== 弹窗 ==========
const
showModal
=
ref
(
false
)
const
modalTitle
=
ref
(
''
)
let
confirmCallback
=
null
onLoad
(()
=>
{
showModal
.
value
=
false
resetList
()
})
onReady
(()
=>
{
showModal
.
value
=
false
...
...
@@ -138,15 +162,15 @@ onShow(() => {
getList
()
})
const
modalTitle
=
ref
(
''
)
let
confirmCallback
=
null
// ========== 2. 移除所有 uni.setPageScrollEnabled 调用 ==========
onUnmounted
(()
=>
{
showModal
.
value
=
false
// 上拉加载更多
onReachBottom
(()
=>
{
if
(
hasMore
.
value
&&
!
loading
.
value
)
{
pageNum
.
value
++
getList
()
}
})
//
新增:状态 Tab 切换
//
切换Tab时重置分页
function
switchTab
(
status
)
{
activeTab
.
value
=
status
if
(
status
===
''
)
{
...
...
@@ -154,14 +178,54 @@ function switchTab(status) {
}
else
{
queryParams
.
value
.
auditStatus
=
status
}
resetList
()
getList
()
}
function
getList
()
{
api
.
getPaymentList
(
queryParams
.
value
).
then
(
res
=>
{
list
.
value
=
res
.
rows
||
[]
// 重置列表
function
resetList
()
{
pageNum
.
value
=
1
list
.
value
=
[]
hasMore
.
value
=
true
}
// 获取列表(支持分页)
async
function
getList
()
{
if
(
loading
.
value
)
return
loading
.
value
=
true
try
{
const
res
=
await
api
.
getPaymentList
({
...
queryParams
.
value
,
pageNum
:
pageNum
.
value
,
pageSize
:
pageSize
.
value
})
const
data
=
res
.
rows
||
[]
total
.
value
=
res
.
total
||
0
})
if
(
pageNum
.
value
===
1
)
{
list
.
value
=
data
}
else
{
list
.
value
=
[...
list
.
value
,
...
data
]
}
if
(
data
.
length
<
pageSize
.
value
)
{
hasMore
.
value
=
false
}
else
{
hasMore
.
value
=
true
}
}
catch
(
err
)
{
console
.
log
(
err
)
}
finally
{
loading
.
value
=
false
}
}
// 搜索时重置
function
searchFN
()
{
resetList
()
getList
()
}
function
goDetail
(
item
)
{
...
...
@@ -175,14 +239,12 @@ function handleUpdate(item) {
uni
.
navigateTo
({
url
:
path
})
}
// 打开弹窗:只控制弹窗显示,滚动锁定交给 CSS
function
openModal
(
title
,
callback
)
{
modalTitle
.
value
=
title
showModal
.
value
=
true
confirmCallback
=
callback
}
// 关闭弹窗:只控制弹窗隐藏,滚动恢复交给 CSS
function
closeModal
()
{
showModal
.
value
=
false
confirmCallback
=
null
...
...
@@ -193,7 +255,6 @@ function confirmModal() {
closeModal
()
}
// 删除
function
handleDel
(
row
)
{
showModal
.
value
=
false
openModal
(
`是否确认删除缴费编号为"
${
row
.
wfCode
}
"的数据项?`
,
()
=>
{
...
...
@@ -201,16 +262,16 @@ function handleDel(row) {
api
.
paymentDel
(
row
.
rangId
).
then
(()
=>
{
uni
.
hideLoading
()
uni
.
showToast
({
title
:
'删除成功'
})
resetList
()
getList
()
})
})
}
// 提交审核
function
commitFN
(
row
)
{
uni
.
navigateTo
({
url
:
`/myCenter/payOrder?rangeId=
${
row
.
rangId
}
`
})
url
:
`/myCenter/payOrder?rangeId=
${
row
.
rangId
}
`
})
}
async
function
goAdd
()
{
...
...
@@ -234,25 +295,26 @@ function getStatusText(status) {
function
getStatusClass
(
status
)
{
const
classMap
=
{
0
:
'status-p
end
ing'
,
1
:
'status-p
rocess
ing'
,
0
:
'status-p
rocess
ing'
,
1
:
'status-p
end
ing'
,
2
:
'status-success'
,
3
:
'status-rejected'
,
9
:
'status-withdrawn'
}
return
classMap
[
status
]
||
'status-default'
}
onUnmounted
(()
=>
{
showModal
.
value
=
false
})
</
script
>
<
style
lang=
"scss"
scoped
>
/* 核心:锁死滚动的样式(优先级最高) */
.container
{
min-height
:
100vh
;
background-color
:
#f8f9fa
;
padding-bottom
:
60
rpx
;
transition
:
all
0.2s
ease
;
position
:
relative
;
}
/* 弹窗时强制固定定位,彻底禁止滚动(纯 CSS 实现,不依赖 API) */
.container.lock-scroll
{
position
:
fixed
;
top
:
0
;
...
...
@@ -262,14 +324,32 @@ function getStatusClass(status) {
overflow
:
hidden
!important
;
}
/* ============= 核心:固定顶部 ============= */
.fixed-header-wrapper
{
position
:
fixed
;
top
:
0
;
left
:
0
;
right
:
0
;
background
:
#fff
;
z-index
:
10
;
box-shadow
:
0
2
rpx
8
rpx
rgba
(
0
,
0
,
0
,
0.04
);
}
/* 内容区域:顶部留出固定栏高度 */
.scroll-content
{
padding-top
:
190
rpx
;
padding-bottom
:
60
rpx
;
min-height
:
100vh
;
box-sizing
:
border-box
;
}
/* 搜索栏 */
.search-bar
{
display
:
flex
;
align-items
:
center
;
padding
:
20
rpx
30
rpx
;
background-color
:
#ffffff
;
margin-bottom
:
24
rpx
;
box-shadow
:
0
2
rpx
12
rpx
rgba
(
0
,
0
,
0
,
0.04
);
margin-bottom
:
0
;
.search-input
{
flex
:
1
;
...
...
@@ -280,18 +360,11 @@ function getStatusClass(status) {
background-color
:
#f5f7fa
;
height
:
76
rpx
;
padding
:
0
24
rpx
;
transition
:
all
0.3s
ease
;
}
:deep
(
.uni-easyinput__content-input
)
{
font-size
:
28
rpx
;
color
:
#333
;
letter-spacing
:
0.5
rpx
;
}
:deep
(
.uni-easyinput__content
)
:focus-within
{
background-color
:
#f0f2f5
;
box-shadow
:
0
0
0
2
rpx
rgba
(
173
,
24
,
31
,
0.1
);
}
}
...
...
@@ -303,28 +376,20 @@ function getStatusClass(status) {
border-radius
:
40
rpx
;
font-size
:
28
rpx
;
color
:
#ffffff
;
box-shadow
:
0
4
rpx
12
rpx
rgba
(
173
,
24
,
31
,
0.2
);
transition
:
all
0.2s
ease
;
&:active
{
transform
:
scale
(
0.96
);
box-shadow
:
0
2
rpx
8
rpx
rgba
(
173
,
24
,
31
,
0.15
);
}
.add-icon
{
font-size
:
36
rpx
;
margin-right
:
10
rpx
;
font-weight
:
bold
;
}
}
.add-icon
{
font-size
:
36
rpx
;
margin-right
:
10
rpx
;
font-weight
:
bold
;
}
}
/*
1. 新增:审核状态筛选 Tab 样式
*/
/*
状态Tab
*/
.status-tabs
{
display
:
flex
;
background
:
#fff
;
padding
:
0
30
rpx
;
margin-bottom
:
20
rpx
;
.tab-item
{
flex
:
1
;
...
...
@@ -354,24 +419,16 @@ function getStatusClass(status) {
}
}
/* 列表
容器
*/
/* 列表 */
.list-container
{
padding
:
0
30
rpx
;
}
/* 列表项 */
.list-item
{
background
:
#ffffff
;
border-radius
:
24
rpx
;
padding
:
36
rpx
32
rpx
;
margin-bottom
:
24
rpx
;
box-shadow
:
0
4
rpx
16
rpx
rgba
(
0
,
0
,
0
,
0.05
);
transition
:
all
0.2s
ease
;
&:active
{
transform
:
translateY
(
2
rpx
);
box-shadow
:
0
2
rpx
8
rpx
rgba
(
0
,
0
,
0
,
0.04
);
}
}
.item-header
{
...
...
@@ -392,7 +449,6 @@ function getStatusClass(status) {
font-weight
:
600
;
color
:
#1a1a1a
;
margin-right
:
16
rpx
;
letter-spacing
:
0.8
rpx
;
}
.wf-code
{
...
...
@@ -401,19 +457,15 @@ function getStatusClass(status) {
background
:
#f0f8fb
;
padding
:
6
rpx
12
rpx
;
border-radius
:
16
rpx
;
margin-top
:
4
rpx
;
}
.status-badge
{
font-size
:
24
rpx
;
padding
:
8
rpx
16
rpx
;
border-radius
:
20
rpx
;
font-weight
:
500
;
letter-spacing
:
0.5
rpx
;
}
}
/* 状态徽章 */
.status-pending
{
background
:
#f5f5f5
;
color
:
#888
;
}
.status-processing
{
background
:
#e8e8ff
;
color
:
#1890ff
;
}
.status-success
{
background
:
#f0fff4
;
color
:
#52c41a
;
}
...
...
@@ -421,7 +473,6 @@ function getStatusClass(status) {
.status-withdrawn
{
background
:
#fffbe6
;
color
:
#faad14
;
}
.status-default
{
background
:
#f5f5f5
;
color
:
#999
;
}
/* 数据统计 */
.stats-row
{
display
:
flex
;
justify-content
:
space-between
;
...
...
@@ -437,9 +488,7 @@ function getStatusClass(status) {
font-size
:
24
rpx
;
color
:
#999
;
margin-bottom
:
10
rpx
;
letter-spacing
:
0.5
rpx
;
}
.stat-value
{
font-size
:
32
rpx
;
font-weight
:
700
;
...
...
@@ -448,7 +497,6 @@ function getStatusClass(status) {
}
}
/* 提交时间 */
.submit-time
{
display
:
flex
;
align-items
:
center
;
...
...
@@ -458,11 +506,9 @@ function getStatusClass(status) {
font-size
:
24
rpx
;
color
:
#666
;
margin-left
:
20
rpx
;
letter-spacing
:
0.3
rpx
;
}
}
/* 操作按钮 */
.action-buttons
{
display
:
flex
;
...
...
@@ -475,27 +521,13 @@ function getStatusClass(status) {
margin
:
0
8
rpx
;
border
:
none
;
font-weight
:
500
;
letter-spacing
:
0.8
rpx
;
transition
:
all
0.2s
ease
;
/* 2. 强化:按钮禁用样式(一眼能看出不可用) */
&:disabled
{
background
:
#f0f0f0
!important
;
color
:
#ccc
!important
;
cursor
:
not-allowed
;
transform
:
none
!important
;
opacity
:
1
!important
;
}
}
.action-btn
[
disabled
]
{
background
:
#f0f0f0
!important
;
color
:
#cccccc
!important
;
opacity
:
1
!important
;
cursor
:
not-allowed
;
transform
:
none
!important
;
}
.delete-btn
{
background
:
#fff2f2
;
color
:
#ff4d4f
;
...
...
@@ -510,12 +542,12 @@ function getStatusClass(status) {
}
}
/* 空
数据
*/
/* 空
状态
*/
.empty-state
{
display
:
flex
;
flex-direction
:
column
;
align-items
:
center
;
padding
:
1
6
0
rpx
40
rpx
0
;
padding
:
1
0
0
rpx
40
rpx
0
;
.empty-icon
{
width
:
240
rpx
;
...
...
@@ -523,15 +555,23 @@ function getStatusClass(status) {
margin-bottom
:
40
rpx
;
opacity
:
0.5
;
}
.empty-text
{
font-size
:
30
rpx
;
color
:
#999
;
letter-spacing
:
1
rpx
;
}
}
/* 弹窗:最高优先级样式 */
/* 加载更多 */
.load-more
{
padding
:
30
rpx
0
;
text-align
:
center
;
.load-text
{
font-size
:
26
rpx
;
color
:
#999
;
}
}
/* 弹窗 */
.modal-mask
{
position
:
fixed
;
top
:
0
;
...
...
@@ -542,78 +582,51 @@ function getStatusClass(status) {
display
:
flex
;
align-items
:
center
;
justify-content
:
center
;
z-index
:
99999
!important
;
/* 最高层级 */
backdrop-filter
:
blur
(
4
rpx
);
touch-action
:
none
!important
;
/* 禁止触摸 */
pointer-events
:
auto
!important
;
/* 强制可点击 */
z-index
:
99999
!important
;
}
.modal-box
{
width
:
85%
;
max-width
:
580
rpx
;
background
:
#fff
fff
;
background
:
#fff
;
border-radius
:
32
rpx
;
padding
:
60
rpx
40
rpx
50
rpx
;
box-shadow
:
0
8
rpx
32
rpx
rgba
(
0
,
0
,
0
,
0.15
);
touch-action
:
none
!important
;
pointer-events
:
auto
!important
;
}
.modal-
con
{
.modal-
title
{
text-align
:
center
;
font-size
:
32
rpx
;
//
font-weight
:
600
;
color
:
#333
;
margin-bottom
:
50
rpx
;
letter-spacing
:
1
rpx
;
line-height
:
1.4
;
margin-bottom
:
20
rpx
;
}
.modal-
title
{
.modal-
con
{
text-align
:
center
;
font-size
:
32
rpx
;
//
font-weight
:
600
;
color
:
#333
;
margin-bottom
:
20
rpx
;
letter-spacing
:
1
rpx
;
line-height
:
1.4
;
margin-bottom
:
50
rpx
;
}
.modal-buttons
{
display
:
flex
;
gap
:
24
rpx
;
}
.btn-cancel
{
flex
:
1
;
height
:
92
rpx
;
line-height
:
92
rpx
;
text-align
:
center
;
font-size
:
32
rpx
;
color
:
#666
;
background
:
#f5f7fa
;
border-radius
:
46
rpx
;
transition
:
all
0.2s
ease
;
&:active
{
background
:
#e8e8e8
;
}
flex
:
1
;
height
:
92
rpx
;
line-height
:
92
rpx
;
text-align
:
center
;
font-size
:
32
rpx
;
color
:
#666
;
background
:
#f5f7fa
;
border-radius
:
46
rpx
;
}
.btn-confirm
{
flex
:
1
;
height
:
92
rpx
;
line-height
:
92
rpx
;
text-align
:
center
;
font-size
:
32
rpx
;
color
:
#fff
;
background
:
linear-gradient
(
135deg
,
#AD181F
0%
,
#c92028
100%
);
border-radius
:
46
rpx
;
font-weight
:
600
;
box-shadow
:
0
6
rpx
16
rpx
rgba
(
173
,
24
,
31
,
0.25
);
transition
:
all
0.2s
ease
;
&:active
{
transform
:
scale
(
0.96
);
box-shadow
:
0
4
rpx
12
rpx
rgba
(
173
,
24
,
31
,
0.2
);
}
flex
:
1
;
height
:
92
rpx
;
line-height
:
92
rpx
;
text-align
:
center
;
font-size
:
32
rpx
;
color
:
#fff
;
background
:
linear-gradient
(
135deg
,
#AD181F
0%
,
#c92028
100%
);
border-radius
:
46
rpx
;
font-weight
:
600
;
}
</
style
>
\ No newline at end of file
...
...
personalVip/renew.vue
View file @
3dd81ab
...
...
@@ -266,7 +266,7 @@
}
.vipData
{
padding
:
10
rpx
20
rpx
;
padding
:
10
rpx
20
rpx
5
rpx
;
font-size
:
28
rpx
;
color
:
#666
;
view
{
margin-bottom
:
10
rpx
;
}
...
...
personalVip/vipList.vue
View file @
3dd81ab
...
...
@@ -200,7 +200,7 @@
.icon
{
width
:
40
rpx
;
height
:
40
rpx
;
margin
-right
:
20
rpx
;
margin
:
0
20
rpx
;
}
.photobox
{
...
...
Write
Preview
Styling with
Markdown
is supported
Attach a file
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 post a comment