Skip to content
Toggle navigation
Toggle navigation
This project
Loading...
Sign in
杨炀
/
dance-pc
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
04b3bff0
authored
2025-06-23 15:49:05 +0800
by
华明祺
Browse Files
Options
Browse Files
Tag
Download
Email Patches
Plain Diff
no message
1 parent
e06a0e25
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
524 additions
and
31 deletions
src/apiPc/match.js
src/routerPc/en.js
src/viewsPc/center/index.vue
src/viewsPc/center/myVisa.vue
src/viewsPc/match/components/affix-invitation-view.vue
vite.config.js
src/apiPc/match.js
View file @
04b3bff
...
...
@@ -790,6 +790,14 @@ export function getVisaInfo(query) {
})
}
export
function
listVisaInfo
(
query
)
{
return
request
({
url
:
'/league/visaInfo/list'
,
method
:
'get'
,
params
:
query
})
}
// 酒店预约查询
export
function
hotelList
(
params
)
{
return
request
({
...
...
src/routerPc/en.js
View file @
04b3bff
...
...
@@ -567,6 +567,12 @@ export const constantRoutes = [
meta
:
{
title
:
'My reservation'
}
},
{
path
:
'myVisa'
,
component
:
()
=>
import
(
'@/viewsPc/center/myVisa'
),
name
:
'myVisa'
,
meta
:
{
title
:
'My visa'
}
},
{
path
:
'mySms'
,
component
:
()
=>
import
(
'@/viewsPc/center/mySms'
),
name
:
'mySms'
,
...
...
src/viewsPc/center/index.vue
View file @
04b3bff
...
...
@@ -47,7 +47,8 @@ import {onMounted} from '@vue/runtime-core'
import
useUserStore
from
'@/store/modules/user'
import
_
from
'lodash'
import
{
useStorage
}
from
"@vueuse/core/index"
;
const
language
=
useStorage
(
'language'
,
0
)
const
language
=
useStorage
(
'language'
,
0
)
const
route
=
useRoute
()
const
router
=
useRouter
()
...
...
@@ -63,14 +64,14 @@ const menus3 = ref([
// isActive: false
// },
{
name
:
language
.
value
==
0
?
'修改密码'
:
'Change Password'
,
name
:
language
.
value
==
0
?
'修改密码'
:
'Change Password'
,
routeName
:
'myPassword'
,
picUrl1
:
'/img/nav_27.png'
,
picUrl2
:
'/img/nav_27_dwn.png'
,
isActive
:
false
},
{
name
:
language
.
value
==
0
?
'我的预订'
:
'My Reservation'
,
name
:
language
.
value
==
0
?
'我的预订'
:
'My Reservation'
,
routeName
:
'myReservation'
,
picUrl1
:
'/img/nav_29.png'
,
picUrl2
:
'/img/nav_29_dwn.png'
,
...
...
@@ -84,7 +85,7 @@ const menus3 = ref([
// isActive: false
// },
{
name
:
language
.
value
==
0
?
'发票申请'
:
'Electronic invoice'
,
name
:
language
.
value
==
0
?
'发票申请'
:
'Electronic invoice'
,
routeName
:
'myKP'
,
picUrl1
:
'/img/fp.svg'
,
picUrl2
:
'/img/fp_dwn.svg'
,
...
...
@@ -100,19 +101,26 @@ const menus3En = ref([
// isActive: false
// },
{
name
:
language
.
value
==
0
?
'修改密码'
:
'Change Password'
,
name
:
language
.
value
==
0
?
'修改密码'
:
'Change Password'
,
routeName
:
'myPassword'
,
picUrl1
:
'/img/nav_27.png'
,
picUrl2
:
'/img/nav_27_dwn.png'
,
isActive
:
false
},
{
name
:
language
.
value
==
0
?
'我的预订'
:
'My Reservation'
,
name
:
language
.
value
==
0
?
'我的预订'
:
'My Reservation'
,
routeName
:
'myReservation'
,
picUrl1
:
'/img/nav_29.png'
,
picUrl2
:
'/img/nav_29_dwn.png'
,
isActive
:
false
},
{
name
:
language
.
value
==
0
?
'签证审核记录'
:
'Visa Review record'
,
routeName
:
'myVisa'
,
picUrl1
:
'/img/fp.svg'
,
picUrl2
:
'/img/fp_dwn.svg'
,
isActive
:
false
},
// {
// name: language.value==0?'票务预订':'Ticket Reservation',
// routeName: 'seat_order',
...
...
@@ -125,18 +133,19 @@ const menus3En = ref([
let
currMenu
onMounted
(()
=>
{
console
.
log
(
route
.
query
)
if
(
!
user
.
utype
)
{
if
(
!
user
.
utype
)
{
router
.
push
({
name
:
'home'
})
return
}
currMenu
=
_
.
find
(
menus3
.
value
,
(
m
)
=>
{
return
m
.
routeName
===
route
.
name
})
currMenu
.
isActive
=
true
currMenu
=
_
.
find
((
language
.
value
==
0
?
menus3
.
value
:
menus3En
.
value
),
(
m
)
=>
{
return
m
.
routeName
===
route
.
name
})
currMenu
.
isActive
=
true
})
const
toInfo
=
(
item
,
list
)
=>
{
const
toInfo
=
(
item
,
list
)
=>
{
_
.
each
(
list
,
(
m
)
=>
{
m
.
isActive
=
false
})
...
...
@@ -159,11 +168,23 @@ const toInfo = (item,list) => {
li
{
margin-bottom
:
15px
;
}
&
.en-menu
{
text-align
:
left
;
li{
padding
:
6px
0
6px
14px
;
a{
display
:
flex
;
align-items
:
center
;}
&
.en-menu
{
text-align
:
left
;
li
{
padding
:
6px
0
6px
14px
;
a
{
display
:
flex
;
align-items
:
center
;
}
}
img
{
padding
:
0
;
width
:
26px
;
}
img
{
padding
:
0
;
width
:
26px
;}
}
}
...
...
@@ -179,24 +200,61 @@ li img {
background
:
#000
;
border-radius
:
20px
;
}
@media
(
max-width
:
500px
)
{
.pd20
{
padding
:
8px
;}
.el-card
{
box-shadow
:
none
!important
;
:deep(.el-card__body){
padding
:
0
!important
;}
.pd20
{
padding
:
8px
;
}
.el-card
{
box-shadow
:
none
!important
;
:deep(.el-card__body)
{
padding
:
0
!important
;
}
}
.el-col
{
padding
:
0
!important
;
}
.el-col
{
padding
:
0
!important
;}
.center-menu
{
height
:
100vh
;
padding
:
20px
0
;
position
:
fixed
;
left
:
0
;
z-index
:
1
;
background
:
#F5F7F9
;
top
:
80px
;
width
:
100px
;
border-right
:
1px
solid
#eee
;
li{
font-size
:
13px
;
padding
:
8px
10px
;
border-radius
:
0
;
img{
display
:
none
}
&
.active
{
background
:
#fff
;
.center-menu
{
height
:
100vh
;
padding
:
20px
0
;
position
:
fixed
;
left
:
0
;
z-index
:
1
;
background
:
#F5F7F9
;
top
:
80px
;
width
:
100px
;
border-right
:
1px
solid
#eee
;
li
{
font-size
:
13px
;
padding
:
8px
10px
;
border-radius
:
0
;
img
{
display
:
none
}
&
.active
{
background
:
#fff
;
border-left
:
2px
solid
var
(
--el-color-primary
);
color
:
var
(
--el-color-primary
);}
color
:
var
(
--el-color-primary
);
}
}
}
.rightPart
{
width
:
calc
(
100vw
-
100px
);
left
:
100px
;
position
:
fixed
;
z-index
:
1
;
height
:
calc
(
100vh
-
80px
);
overflow
:
auto
;
top
:
80px
;
background
:
#fff
;
.rightPart
{
width
:
calc
(
100vw
-
100px
);
left
:
100px
;
position
:
fixed
;
z-index
:
1
;
height
:
calc
(
100vh
-
80px
);
overflow
:
auto
;
top
:
80px
;
background
:
#fff
;
}
}
.app-container
{
min-height
:
80vh
;}
.app-container
{
min-height
:
80vh
;
}
</
style
>
...
...
src/viewsPc/center/myVisa.vue
0 → 100644
View file @
04b3bff
<
template
>
<div>
<el-card
:body-style=
"
{'padding':'0'}">
<div
class=
"indexTitle"
>
<h3
class=
"leftboderTT"
>
{{
language
==
0
?
'我的签证'
:
'My visa'
}}
</h3>
<!--
<el-button
class=
"fr"
type=
"primary"
plain
@
click=
"toInvoice"
>
{{
language
==
0
?
'发票开具'
:
'Invoice'
}}
</el-button>
-->
<!--
<el-button
class=
"fr"
type=
"primary"
plain
@
click=
"toInvoice"
>
{{
language
==
0
?
'我的发票'
:
'My Invoice'
}}
</el-button>
-->
</div>
<el-empty
v-if=
"list?.length == 0"
:image=
"`/img/order_no.png`"
:image-size=
"228"
/>
<div
class=
"pd20"
>
<div
v-for=
"b in list"
class=
"item"
>
<div
class=
"title"
>
<label
class=
"orangeTag"
>
{{
b
.
applicatTypeName
}}
</label>
<span>
{{
language
==
0
?
'订单编号:'
:
'No.'
}}
{{
b
.
id
}}
</span>
</div>
<div
class=
"status-po"
>
<span
v-if=
"b.status == '0'"
class=
"bg-gary"
>
{{
'Under Review'
}}
</span>
<span
v-if=
"b.status == '1'"
class=
"bg-blue"
>
{{
'Approved'
}}
</span>
<span
v-if=
"b.status == '2'"
class=
"bg-danger"
>
{{
'Rejected'
}}
</span>
</div>
<el-row
align=
"middle"
class=
"pd20 mt10"
justify=
"space-between"
>
<el-col
:lg=
"9"
:md=
"12"
:sm=
"12"
:xs=
"24"
>
<div>
<h3
class=
"name"
>
{{
b
.
fullName
}}
</h3>
<p>
{{
b
.
email
}}
</p>
<!--
<p>
{{
b
.
phone
}}
</p>
-->
</div>
</el-col>
<el-col
:lg=
"3"
:md=
"6"
:sm=
"6"
:xs=
"6"
class=
"text-center"
>
<span
class=
"text-warning"
>
{{
b
.
invitationTypeName
}}
</span>
</el-col>
<el-col
:lg=
"6"
:md=
"16"
:sm=
"16"
:xs=
"16"
>
<div
class=
"text-right"
>
<el-button
class=
"mb10"
plain
round
size=
"small"
type=
"primary"
@
click=
"goDetail(b)"
>
{{
language
==
0
?
'详情'
:
'Detail'
}}
</el-button>
</div>
</el-col>
</el-row>
</div>
</div>
</el-card>
<affix-invitation-view
ref=
"affixInvitationRef"
></affix-invitation-view>
</div>
</
template
>
<
script
setup
>
import
{
onMounted
,
getCurrentInstance
}
from
"@vue/runtime-core"
;
import
{
useStorage
}
from
"@vueuse/core/index"
;
// import {newbilllist} from "@/apiPc/common";
import
useUserStore
from
"@/store/modules/user"
;
// import dayjs from 'dayjs'
import
{
cancelOrder2
,
cancelOrder
}
from
"/@/apiPc/booking"
;
import
{
ElMessage
}
from
"element-plus"
;
import
{
getVisaInfo
}
from
"/@/apiPc/match"
;
import
AffixInvitationView
from
"/@/viewsPc/match/components/affix-invitation-view.vue"
;
import
{
ref
}
from
"vue"
;
import
{
useRouter
}
from
"vue-router"
;
const
router
=
useRouter
()
const
language
=
useStorage
(
'language'
,
0
)
const
list
=
ref
([])
const
user
=
useUserStore
().
user
const
{
proxy
}
=
getCurrentInstance
()
const
affixInvitationRef
=
ref
(
null
)
onMounted
(()
=>
{
getList
()
})
function
finish
(
bill
)
{
bill
.
status
=
'2'
// getList()
}
function
getList
()
{
getVisaInfo
({
userId
:
user
.
userId
}).
then
(
res
=>
{
list
.
value
=
res
.
rows
||
[]
for
(
let
b
of
list
.
value
)
{
b
.
messageObj
=
JSON
.
parse
(
b
.
message
)
||
{}
b
.
extJsonObj
=
JSON
.
parse
(
b
.
extJson
)
||
{}
if
(
b
.
orderType
==
5
)
{
try
{
b
.
extJsonObj
.
ticketDate
=
b
.
extJsonObj
.
ticketDate
?
JSON
.
parse
(
b
.
extJsonObj
.
ticketDate
)
:
{}
b
.
extJsonObj
.
ticketType
=
b
.
extJsonObj
.
ticketType
?
JSON
.
parse
(
b
.
extJsonObj
.
ticketType
)
:
{}
}
catch
(
e
)
{
console
.
log
(
e
)
}
}
if
(
b
.
surplus
&&
b
.
status
==
'0'
&&
(
b
.
surplus
!=
'0,0'
&&
b
.
surplus
!=
'0'
))
{
b
.
countdown
=
Date
.
now
()
+
Number
((
b
.
surplus
.
split
(
','
)[
0
]
*
60
+
b
.
surplus
.
split
(
','
)[
1
])
*
10
)
}
}
})
}
function
goDetail
(
b
)
{
affixInvitationRef
.
value
.
open
(
b
)
// router.push({
// name: 'bookingPay',
// query: {
// orderId: b.id,
// orderType: b.orderType
// }
// })
}
function
Rebook
(
row
)
{
console
.
log
(
row
)
if
(
row
.
orderType
==
0
)
{
router
.
push
({
name
:
'hotelDetail'
,
params
:
{
cptId
:
row
.
activeId
,
hotelId
:
row
.
hotelId
},
query
:
{
id
:
row
.
extId
}
})
}
else
{
router
.
push
({
name
:
'ticket'
,
params
:
{
activeId
:
row
.
activeId
,
}
})
}
}
const
cancel
=
(
row
)
=>
{
//取消订单
proxy
.
$modal
.
confirm
(
language
.
value
==
0
?
'确定取消订单吗 ?'
:
`Are you sure to cancel the order?`
).
then
(()
=>
{
return
cancelOrder2
(
row
.
id
).
then
(
res
=>
{
getList
()
ElMessage
({
message
:
language
.
value
==
0
?
'操作成功'
:
'Successful operation!'
,
type
:
'success'
})
})
})
}
const
unsubscribe
=
(
row
)
=>
{
proxy
.
$modal
.
confirm
(
language
.
value
==
0
?
`确定退款吗 ?`
:
'Are you sure to refund?'
).
then
(()
=>
{
return
cancelOrder
(
row
.
id
).
then
(
res
=>
{
getList
()
ElMessage
({
message
:
language
.
value
==
0
?
'已提交退款,请等待审核!'
:
'Refund has been submitted, please wait for review!'
,
type
:
'success'
})
})
})
}
function
toInvoice
()
{
router
.
push
({
name
:
'invoice'
})
}
</
script
>
<
style
lang=
"scss"
scoped
>
.bigMoney
{
font-size
:
24px
;
font-family
:
"DIN Alternate"
;
}
.name
{
font-size
:
18px
;
margin
:
0
;
}
.status-po
{
position
:
absolute
;
right
:
0
;
top
:
0
;
font-size
:
12px
;
color
:
#FFFFFF
;
span
{
border-radius
:
0px
10px
0px
10px
;
padding
:
4px
10px
;
}
.bg-danger
{
background
:
#E60012
;
}
.bg-warning
{
background
:
#e89f39
;
}
.bg-pink
{
background
:
#F740A6
;
}
.bg-primary
{
background
:
var
(
--el-color-primary
)
}
.bg-blue
{
background
:
#00a0e9
}
}
.indexTitle
{
margin
:
20px
0
12px
;
overflow
:
visible
;
padding
:
0
20px
15px
;
border-bottom
:
1px
solid
#e5e5e5
;
.fr
{
margin
:
-8px
0
0
}
h3
{
display
:
inline-block
;
font-size
:
16px
;
color
:
var
(
--el-color-primary
);
}
}
.item
{
.name
{
font-size
:
18px
;
color
:
#000000
;
margin
:
0
0
10px
;
}
p
{
margin
:
8px
0
0
;
color
:
#707070
;
font-size
:
14px
;
}
margin
:
0
0
20px
;
border
:
1px
solid
#E5E5E5
;
border-radius
:
10px
;
position
:
relative
;
.bbody
{
padding
:
0
15px
20px
;
}
.title
{
background
:
#F7F7F7
;
border-bottom
:
1px
solid
#E5E5E5
;
span
{
font-size
:
14px
;
color
:
#4C5359
;
}
}
.title
label
{
border-radius
:
5px
0
5px
0
;
font-size
:
12px
;
color
:
#fff
;
padding
:
4px
10px
;
margin-right
:
10px
;
}
.blueTag
{
background-color
:
#1EC886
;
}
.purpleTag
{
background-color
:
#717bef
;
}
.orangeTag
{
background-color
:
#ff8124
;
}
}
.billFoot
{
.price
{
width
:
100%
;
justify-content
:
space-between
;
}
}
.billFoot
.tip
{
font-size
:
24px
;
color
:
#999
;
font-weight
:
500
;
margin
:
0
20px
;
}
.status
{
position
:
absolute
;
right
:
10px
;
bottom
:
60px
;
white-space
:
nowrap
;
.warning
{
color
:
#ff8124
;
}
.danger
{
color
:
#da2a2a
;
}
.gary
{
color
:
#666
;
}
.success
{
color
:
#1EC886
;
}
}
</
style
>
src/viewsPc/match/components/affix-invitation-view.vue
0 → 100644
View file @
04b3bff
<
template
>
<el-dialog
v-model=
"show"
title=
"Visa Invitation Letter"
append-to-body
close-icon=
"CircleClose"
center
close-on-click-modal
destroy-on-close
width=
"1100"
>
<el-descriptions
border
>
<el-descriptions-item
label=
"No."
>
{{
form
.
id
}}
</el-descriptions-item>
<el-descriptions-item
label=
"Applicant Type"
>
{{
form
.
remarks
||
form
.
applicatTypeName
}}
</el-descriptions-item>
<el-descriptions-item
label=
"Invitation Type"
>
{{
form
.
invitationTypeName
}}
</el-descriptions-item>
<el-descriptions-item
label=
"Do you need a Chinese invitation?"
>
{{
form
.
chinese
==
'1'
?
'YES'
:
'No'
}}
</el-descriptions-item>
<el-descriptions-item
label=
"MNA/Team Name"
>
{{
form
.
nameEn
}}
</el-descriptions-item>
<el-descriptions-item
label=
"MNA/Team Address"
>
{{
form
.
associationAddress
}}
</el-descriptions-item>
<el-descriptions-item
label=
"Contact Email"
>
{{
form
.
email
}}
</el-descriptions-item>
<el-descriptions-item
label=
"Full Name"
>
{{
form
.
fullName
}}
</el-descriptions-item>
<el-descriptions-item
label=
"Position"
>
{{
form
.
remarks1
||
form
.
positionName
}}
</el-descriptions-item>
<el-descriptions-item
label=
"Phone"
>
{{
form
.
phone
}}
</el-descriptions-item>
<el-descriptions-item
label=
"Chinese Embassy Visas Office"
>
{{
form
.
embassy
}}
</el-descriptions-item>
<el-descriptions-item
label=
"Chinese Embassy Email"
>
{{
form
.
embassyEmail
}}
</el-descriptions-item>
<el-descriptions-item
label=
"Additional Documents"
>
<el-link
v-if=
"form.files"
:href=
"fillImgUrl(form.files)"
target=
"_blank"
type=
"primary"
>
additional documents
</el-link>
</el-descriptions-item>
<el-descriptions-item
label=
"Proof of Employment"
>
<el-link
v-if=
"form.invitationFile"
target=
"_blank"
:href=
"fillImgUrl(form.invitationFile)"
type=
"primary"
>
proof of employment
</el-link>
</el-descriptions-item>
</el-descriptions>
<!--
<el-divider></el-divider>
-->
<br/>
<el-table
:data=
"visaList"
border
stripe
>
<el-table-column
prop=
"passportCopy"
label=
"Passport Copy"
>
<template
#
default=
"
{row}">
<el-image
:src=
"fillImgUrl(row.passportCopy)"
:preview-src-list=
"[fillImgUrl(row.passportCopy)]"
:preview-teleported=
"true"
style=
"width: 50px;height: 70px"
/>
</
template
>
</el-table-column>
<el-table-column
label=
"position"
align=
"center"
prop=
"position"
/>
<el-table-column
label=
"lastName"
align=
"center"
prop=
"lastName"
/>
<el-table-column
label=
"firstName"
align=
"center"
prop=
"fristName"
/>
<el-table-column
prop=
"sex"
label=
"Gender"
align=
"center"
>
<
template
#
default=
"{row}"
>
{{
row
.
sex
==
'0'
?
'M'
:
'F'
}}
</
template
>
</el-table-column>
<el-table-column
label=
"nationality"
align=
"center"
prop=
"nationality"
/>
<el-table-column
label=
"birthday"
align=
"center"
prop=
"birthday"
/>
<el-table-column
label=
"Passport No."
align=
"center"
prop=
"passportNo"
/>
<el-table-column
label=
"DATE OF ISSUE"
align=
"center"
prop=
"issueDate"
/>
<el-table-column
label=
"DATE OF EXPIRY"
align=
"center"
prop=
"expiryDate"
/>
</el-table>
</el-dialog>
</template>
<
script
setup
>
import
{
useStorage
}
from
"@vueuse/core/index"
;
import
{
getCurrentInstance
,
ref
}
from
"vue"
;
import
{
listVisaInfo
}
from
"@/apiPc/match"
;
import
useUserStore
from
"@/store/modules/user"
;
import
{
fillImgUrl
}
from
"/@/utils/ruoyi"
;
const
user
=
useUserStore
().
user
const
{
proxy
}
=
getCurrentInstance
()
const
language
=
useStorage
(
'language'
,
0
)
const
form
=
ref
({
gender
:
'0'
,
cptVisaInfoBos
:
[],
email
:
user
?.
email
,
})
const
show
=
ref
(
false
)
const
visaList
=
ref
([])
const
open
=
(
params
)
=>
{
show
.
value
=
true
form
.
value
=
params
listVisaInfo
({
visaId
:
params
.
id
})
.
then
((
res
)
=>
{
visaList
.
value
=
res
.
rows
})
}
defineExpose
({
open
})
</
script
>
<
style
scoped
lang=
"scss"
>
</
style
>
vite.config.js
View file @
04b3bff
...
...
@@ -76,13 +76,13 @@ export default defineConfig(({ mode, command }) => {
rewrite
:
(
p
)
=>
p
.
replace
(
/^
\/
dev-api
\/
ztx-match/
,
''
)
},
'/dev-api/ztx-webSite'
:
{
target
:
'http://192.168.1.118:808
1
/'
,
target
:
'http://192.168.1.118:808
2
/'
,
// target: 'https://ces.2025wtcwuxi.com/stage-api/',
changeOrigin
:
true
,
rewrite
:
(
p
)
=>
p
.
replace
(
/^
\/
dev-api
\/
ztx-webSite/
,
''
)
},
'/dev-api'
:
{
target
:
'http://192.168.1.118:808
1
/'
,
target
:
'http://192.168.1.118:808
2
/'
,
// target: 'http://192.168.1.131:8081/',
// target: 'https://ces.2025wtcwuxi.com/stage-api/',
// target: 'http://124.70.181.90:1880/stage-api',
...
...
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