04b3bff0 by 华明祺

no message

1 parent e06a0e25
......@@ -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({
......
......@@ -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',
......
......@@ -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>
......
<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>
<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>
......@@ -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:8081/',
target: 'http://192.168.1.118:8082/',
// 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:8081/',
target: 'http://192.168.1.118:8082/',
// target: 'http://192.168.1.131:8081/',
// target: 'https://ces.2025wtcwuxi.com/stage-api/',
// target: 'http://124.70.181.90:1880/stage-api',
......
Styling with Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!