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
55b06f5f
authored
2026-04-23 13:12:49 +0800
by
lttnew
Browse Files
Options
Browse Files
Tag
Download
Email Patches
Plain Diff
考点申请
1 parent
51313627
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
107 additions
and
266 deletions
config.js
myCenter/chooseExaminer.vue
myCenter/examPointApply.vue
myCenter/examPointApplyList.vue
pages/index/home.vue
config.js
View file @
55b06f5
// dev
// const baseUrl_api = 'http://192.168.1.1
37
:8787'
// const baseUrl_api = 'http://192.168.1.1
25
:8787'
const
baseUrl_api
=
'https://tk001.wxjylt.com/stage-api/'
const
loginImage_api
=
'http://tk001.wxjylt.com/stage-api'
const
payUrl
=
'https://wxpay.cmbc.com.cn/mobilePlatform/appserver/lcbpPay.do'
...
...
myCenter/chooseExaminer.vue
View file @
55b06f5
<
template
>
<view
class=
"container"
>
<!-- 搜索区域:固定在顶部 -->
<view
class=
"search-area"
>
<view
class=
"search-item"
>
<text>
考官姓名:
</text>
<input
v-model=
"queryParams.name"
class=
"search-input"
placeholder=
"请输入考官姓名"
/>
</view>
<view
class=
"search-item"
>
<text>
考官编号:
</text>
<input
v-model=
"queryParams.certCode"
class=
"search-input"
placeholder=
"请输入考官编号"
/>
</view>
<view
class=
"search-buttons"
>
<button
class=
"search-btn"
@
click=
"handleQuery"
>
查询
</button>
<button
class=
"reset-btn"
@
click=
"resetQuery"
>
重置
</button>
</view>
</view>
<view
v-for=
"(item, index) in infoList"
:key=
"item.perId"
class=
"list-item"
>
<view
class=
"info"
>
<view
class=
"name"
>
{{
item
.
name
}}
{{
item
.
perCode
}}
</view>
<view
class=
"idc"
>
证件号码:
{{
item
.
idcCode
}}
</view>
<view
class=
"reg"
>
注册地:
{{
item
.
memName
}}
</view>
</view>
<button
:class=
"
{ disabled: checkChosen(item) }"
:disabled="checkChosen(item)"
class="choose-btn"
@click="handleChoose(item)"
>
{{
checkChosen
(
item
)
?
'已选择'
:
'选择'
}}
</button>
</view>
<uni-popup
ref=
"expirePopup"
background-color=
"rgba(0,0,0,0.5)"
type=
"center"
>
<view
class=
"custom-modal"
>
<view
class=
"modal-title"
>
提示
</view>
<view
class=
"modal-content"
>
该考官资质已过期,是否继续添加?
</view>
<view
class=
"modal-btns"
>
<button
class=
"btn-cancel"
@
click=
"closeExpirePopup()"
>
取消
</button>
<button
class=
"btn-confirm"
@
click=
"confirmAddExpireExaminer()"
>
确定
</button>
<view
class=
"loading-tip"
v-if=
"loading"
>
加载中...
</view>
<view
class=
"empty-tip"
v-else-if=
"infoList.length === 0"
>
暂无可添加的考官
</view>
<checkbox-group
class=
"examiner-list"
@
change=
"onCheckboxChange"
>
<label
v-for=
"item in infoList"
:key=
"item.perId"
class=
"examiner-item"
>
<view
class=
"item-left"
>
<checkbox
:value=
"item.perId.toString()"
:checked=
"selectedIds.includes(item.perId.toString())"
:disabled=
"checkChosen(item)"
color=
"#C4121B"
/>
</view>
<view
class=
"item-info"
>
<view
class=
"name"
>
{{
item
.
perName
}}
</view>
<view
class=
"idc"
>
会员号:
{{
item
.
perCode
}}
</view>
<view
class=
"idc"
>
证件号码:
{{
item
.
perIdcCode
}}
</view>
<view
class=
"reg"
>
注册地:
{{
item
.
memName
}}
</view>
</view>
</view>
</uni-popup>
<view
v-if=
"checkChosen(item)"
class=
"chosen-tag"
>
已添加
</view>
</label>
</checkbox-group>
<view
class=
"bottom-area"
>
<view
class=
"selected-tip"
v-if=
"selectedIds.length > 0"
>
已选择
{{
selectedIds
.
length
}}
位考官
</view>
<view>
<button
class=
"add-btn"
:disabled=
"selectedIds.length === 0"
@
click=
"handleAdd"
>
添加
</button></view>
</view>
</view>
</
template
>
<
script
setup
>
import
{
ref
,
reactive
,
toRefs
}
from
'vue'
import
{
onLoad
}
from
'@dcloudio/uni-app'
;
import
{
ref
}
from
'vue'
import
{
onLoad
}
from
'@dcloudio/uni-app'
import
*
as
api
from
'@/common/api.js'
import
_
from
'lodash'
const
props
=
defineProps
({
isValidity
:
{
type
:
String
,
default
:
'0'
}
})
const
isValidity
=
ref
(
'0'
)
const
memId
=
ref
(
''
)
const
chosen
=
ref
([])
const
expirePopup
=
ref
(
null
)
const
currentExpireItem
=
ref
(
null
)
const
loading
=
ref
(
true
)
const
infoList
=
ref
([])
const
loading
=
ref
(
false
)
const
total
=
ref
(
0
)
const
selfSelect
=
ref
(
'0'
)
const
data
=
reactive
({
queryParams
:
{
pageNum
:
1
,
pageSize
:
10
,
name
:
null
,
certCode
:
null
,
type
:
1
,
shenMemId
:
''
}
})
const
{
queryParams
}
=
toRefs
(
data
)
const
chosen
=
ref
([])
const
selectedIds
=
ref
([])
const
memId
=
ref
(
''
)
onLoad
((
option
)
=>
{
console
.
log
(
option
)
isValidity
.
value
=
option
.
isValidity
memId
.
value
=
option
.
memId
chosen
.
value
=
JSON
.
parse
(
option
.
chosen
)
selfSelect
.
value
=
option
.
selfSelect
??
'1'
memId
.
value
=
option
.
memId
||
''
chosen
.
value
=
option
.
chosen
?
JSON
.
parse
(
option
.
chosen
)
:
[]
getList
()
})
// 获取考官列表
async
function
getList
()
{
if
(
!
queryParams
.
value
.
name
)
return
uni
.
showToast
({
title
:
'请输入考官姓名'
,
icon
:
'none'
})
if
(
queryParams
.
value
.
type
==
1
&&
!
queryParams
.
value
.
certCode
)
return
uni
.
showToast
({
title
:
'请输入考官编号'
,
icon
:
'none'
})
loading
.
value
=
true
try
{
const
res
=
await
api
.
getCoachList
(
queryParams
.
value
)
const
res
=
await
api
.
listApi
({
chooseFlag
:
1
}
)
infoList
.
value
=
res
.
rows
||
[]
total
.
value
=
res
.
total
||
0
}
catch
(
err
)
{
console
.
error
(
'获取考官列表失败:'
,
err
)
infoList
.
value
=
[]
total
.
value
=
0
}
finally
{
loading
.
value
=
false
}
// 空数组提示
if
(
infoList
.
value
.
length
===
0
)
{
uni
.
showToast
({
title
:
'请核实考官编号、有效期及归属地'
,
icon
:
'none'
,
duration
:
2000
})
}
}
// 检查是否已选择
function
checkChosen
(
row
)
{
return
_
.
some
(
chosen
.
value
,
(
c
)
=>
{
return
c
.
perId
==
row
.
perId
})
}
// 查询
function
handleQuery
()
{
queryParams
.
value
.
pageNum
=
1
getList
()
function
checkChosen
(
item
)
{
return
chosen
.
value
.
some
(
c
=>
c
.
perId
==
item
.
perId
)
}
// 重置
function
resetQuery
()
{
queryParams
.
value
.
name
=
null
queryParams
.
value
.
certCode
=
null
infoList
.
value
=
[]
total
.
value
=
0
function
onCheckboxChange
(
e
)
{
selectedIds
.
value
=
e
.
detail
.
value
}
function
handleChoose
(
row
)
{
if
(
checkChosen
(
row
))
{
return
uni
.
showToast
({
title
:
'已选择该考官'
,
icon
:
'none'
})
}
// 暂存当前考官数据
currentExpireItem
.
value
=
row
// 资质过期逻辑
if
(
row
.
canChoose
!=
1
)
{
// 打开自定义过期确认弹窗
expirePopup
.
value
.
open
()
function
handleAdd
()
{
if
(
selectedIds
.
value
.
length
===
0
)
{
uni
.
showToast
({
title
:
'请先选择考官'
,
icon
:
'none'
})
return
}
confirmAddExpireExaminer
()
}
// 关闭过期确认弹窗
function
closeExpirePopup
()
{
expirePopup
.
value
.
close
()
}
const
ids
=
selectedIds
.
value
.
join
(
','
)
// 确认添加过期考官
async
function
confirmAddExpireExaminer
()
{
if
(
!
currentExpireItem
.
value
)
return
try
{
if
(
selfSelect
.
value
==
1
)
{
// 自己添
await
api
.
selfAdd
(
currentExpireItem
.
value
.
perId
)
}
else
{
// 省级添加
await
api
.
otherAdd
(
memId
.
value
,
currentExpireItem
.
value
.
perId
)
}
uni
.
showLoading
({
title
:
'添加中...'
})
api
.
selfAdd
(
ids
).
then
(()
=>
{
uni
.
hideLoading
()
uni
.
showToast
({
title
:
'添加成功'
,
icon
:
'success'
})
uni
.
navigateBack
({
delta
:
1
})
}
catch
(
err
)
{
console
.
log
(
err
)
const
errMsg
=
err
?.
data
?.
msg
||
err
?.
msg
||
'添加失败'
uni
.
showToast
({
title
:
errMsg
,
icon
:
'none'
,
duration
:
3000
})
}
finally
{
expirePopup
.
value
.
close
()
currentExpireItem
.
value
=
null
await
getList
()
}
uni
.
navigateBack
()
}).
catch
(
err
=>
{
uni
.
hideLoading
()
uni
.
showToast
({
title
:
err
?.
data
?.
msg
||
'添加失败'
,
icon
:
'none'
})
})
}
</
script
>
<
style
scoped
>
.container
{
display
:
flex
;
flex-direction
:
column
;
background
:
#f7f7f7
;
min-height
:
100vh
;
padding
:
0
;
}
.search-area
{
background
:
#ffffff
;
border-radius
:
16
rpx
;
padding
:
30
rpx
;
margin
:
30
rpx
;
flex-shrink
:
0
;
}
.search-item
{
display
:
flex
;
align-items
:
center
;
margin-bottom
:
20
rpx
;
}
.search-input
{
flex
:
1
;
border
:
1
rpx
solid
#ddd
;
border-radius
:
8
rpx
;
padding
:
20
rpx
;
font-size
:
28
rpx
;
}
.search-buttons
{
display
:
flex
;
justify-content
:
space-between
;
margin-top
:
30
rpx
;
margin-left
:
80px
;
.container
{
min-height
:
100vh
;
background
:
#f7f7f7
;
padding-bottom
:
140
rpx
;
}
.search-btn
,
.reset-btn
{
width
:
220
rpx
;
height
:
70
rpx
;
line-height
:
70
rpx
;
border-radius
:
8
rpx
;
.loading-tip
,
.empty-tip
{
text-align
:
center
;
padding
:
100
rpx
0
;
font-size
:
28
rpx
;
color
:
#666
;
}
.search-btn
{
background
:
#C4121B
;
color
:
#fff
;
}
.reset-btn
{
background
:
#f7f7f7
;
color
:
#333
;
}
/* 列表区域:滚动 */
.list-area
{
flex
:
1
;
background
:
#ffffff
;
border-radius
:
16
rpx
;
margin
:
0
30
rpx
30
rpx
;
padding
:
0
30
rpx
;
.examiner-list
{
background
:
#fff
;
}
.list-item
{
.examiner-item
{
display
:
flex
;
align-items
:
center
;
padding
:
30
rpx
;
margin
:
0
30
rpx
;
border-bottom
:
1
rpx
solid
#eee
;
background-color
:
#fff
;
}
.info
{
.item-left
{
margin-right
:
20
rpx
;
}
.item-info
{
flex
:
1
;
}
...
...
@@ -262,83 +124,60 @@ async function confirmAddExpireExaminer() {
font-size
:
30
rpx
;
font-weight
:
bold
;
color
:
#333
;
margin-bottom
:
10
rpx
;
}
.idc
,
.reg
{
font-size
:
2
6
rpx
;
font-size
:
2
4
rpx
;
color
:
#666
;
margin
:
20
rpx
0
;
margin
-bottom
:
6
rpx
;
}
.choose-btn
{
color
:
#C4121B
;
font-size
:
26
rpx
;
border
:
1
rpx
solid
#C4121B
;
border-radius
:
8
rpx
;
padding
:
10
rpx
20
rpx
;
background-color
:
#fff
;
margin
:
10
rpx
auto
;
}
.choose-btn.disabled
{
color
:
#ccc
;
border-color
:
#ccc
;
.chosen-tag
{
font-size
:
24
rpx
;
color
:
#999
;
background
:
#f5f5f5
;
padding
:
6
rpx
16
rpx
;
border-radius
:
4
rpx
;
}
/* 自定义弹窗样式(和之前保持统一) */
.custom-modal
{
width
:
600
rpx
;
.bottom-area
{
position
:
fixed
;
bottom
:
0
;
left
:
0
;
right
:
0
;
background
:
#fff
;
border-radius
:
20
rpx
;
padding
:
40
rpx
30
rpx
;
box-sizing
:
border-box
;
text-align
:
center
;
}
.modal-title
{
font-size
:
36
rpx
;
font-weight
:
600
;
color
:
#333
;
margin-bottom
:
30
rpx
;
}
.modal-content
{
font-size
:
30
rpx
;
color
:
#666
;
line-height
:
1.6
;
margin-bottom
:
30
rpx
;
}
.modal-btns
{
padding
:
20
rpx
30
rpx
;
padding-bottom
:
calc
(
20
rpx
+
constant
(
safe-area-inset-bottom
));
padding-bottom
:
calc
(
20
rpx
+
env
(
safe-area-inset-bottom
));
border-top
:
1
rpx
solid
#eee
;
display
:
flex
;
align-items
:
center
;
justify-content
:
space-between
;
gap
:
20
rpx
;
}
.btn-cancel
{
flex
:
1
;
height
:
80
rpx
;
line-height
:
80
rpx
;
background
:
#f5f5f5
;
color
:
#999
;
border-radius
:
40
rpx
;
font-size
:
32
rpx
;
border
:
none
;
.selected-tip
{
font-size
:
26
rpx
;
color
:
#666
;
}
.
btn-confirm
{
flex
:
1
;
height
:
8
0
rpx
;
line-height
:
8
0
rpx
;
.
add-btn
{
width
:
200
rpx
;
height
:
7
0
rpx
;
line-height
:
7
0
rpx
;
background
:
#C4121B
;
color
:
#fff
;
border-radius
:
40
rpx
;
font-size
:
32
rpx
;
font-size
:
28
rpx
;
border-radius
:
35
rpx
;
border
:
none
;
}
/* 去除button默认边框 */
.btn-cancel
::after
,
.btn-confirm
::after
{
.add-btn
[
disabled
]
{
background
:
#ccc
;
color
:
#fff
;
}
.add-btn
::after
{
border
:
none
;
}
</
style
>
...
...
myCenter/examPointApply.vue
View file @
55b06f5
...
...
@@ -135,7 +135,7 @@ function onSelfSelectChange(e) {
function
handelAddExamine
()
{
const
chosenStr
=
JSON
.
stringify
(
list
.
value
)
uni
.
navigateTo
({
url
:
`/myCenter/chooseExaminer?memId=
${
memId
.
value
}
&
isValidity=0&
chosen=
${
chosenStr
}
`
url
:
`/myCenter/chooseExaminer?memId=
${
memId
.
value
}
&chosen=
${
chosenStr
}
`
})
}
...
...
myCenter/examPointApplyList.vue
View file @
55b06f5
...
...
@@ -2,7 +2,7 @@
<view
class=
"exam-point-list"
>
<!-- 顶部申请按钮 -->
<view
class=
"apply-btn-box"
>
<button
class=
"apply-btn"
:disabled=
"memberInfo.isPoints==0&&
member
Info.auditStatus==2"
@
click=
"goApply"
>
申请考点
</button>
<button
class=
"apply-btn"
:disabled=
"memberInfo.isPoints==0&&
form
Info.auditStatus==2"
@
click=
"goApply"
>
申请考点
</button>
</view>
<!-- 列表 -->
...
...
@@ -59,6 +59,7 @@ const noMore = ref(false)
const
pageNum
=
ref
(
1
)
const
pageSize
=
ref
(
10
)
const
memberInfo
=
app
.
globalData
.
memberInfo
const
formInfo
=
ref
({})
onLoad
(()
=>
{
loadData
()
})
...
...
@@ -68,6 +69,7 @@ function loadData() {
loading
.
value
=
true
getMyRecent
().
then
(
res
=>
{
formInfo
.
value
=
res
.
data
if
(
res
.
data
&&
res
.
data
.
auditLogs
)
{
try
{
list
.
value
=
JSON
.
parse
(
res
.
data
.
auditLogs
)
...
...
pages/index/home.vue
View file @
55b06f5
...
...
@@ -126,10 +126,10 @@
<image
:src=
"config.baseUrl_api+'/fs/static/icon/25.png'"
/>
证书邮寄
</view>
<view
@
click=
"goPath('/level/ztx/costSettlement')"
>
<
!--
<
view
@
click=
"goPath('/level/ztx/costSettlement')"
>
<image
:src=
"config.baseUrl_api+'/fs/static/icon/10.png'"
/>
证书下载
</view>
</view>
-->
<view
@
click=
"goPath('/personalVip/changeLevel')"
>
<image
:src=
"config.baseUrl_api+'/fs/static/icon/26.png'"
/>
级位变更
...
...
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