d69b2fe1 by zhangmeng

Merge branch 'order' of https://code.itechtop.cn/yangyang/dance-pc into order

2 parents 848a4831 421304e8
......@@ -30,6 +30,7 @@
"jszip": "^3.10.1",
"katex": "^0.16.6",
"lodash": "^4.17.21",
"md5js": "^1.0.7",
"nprogress": "0.2.0",
"pinia": "2.0.35",
"qrcode": "^1.5.3",
......
This diff could not be displayed because it is too large.
No preview for this file type
......@@ -1078,7 +1078,8 @@ img{display: block;}
text-decoration: underline;}
}
.panel-title{font-size: 16px;line-height: 50px;margin: 0;
color: var(--el-color-primary)}
color: var(--el-color-primary)
}
.panel-body{padding: 20px;}
&.border{border: 1px solid #EEEEEE;}
}
......
......@@ -12,12 +12,13 @@
>
<el-menu-item index="/">{{ language==0?'首页':'HOME' }}</el-menu-item>
<el-menu-item index="/news">{{ language==0?'新闻资讯':'NEWS' }}</el-menu-item>
<el-menu-item index="/notice">{{ language==0?'通知公告':'NOTICEBOARD' }}</el-menu-item>
<el-menu-item index="/guide">{{ language==0?'参赛指南':'GUIDELINE' }}</el-menu-item>
<el-menu-item index="/match/list">{{ language==0?'大赛报名':'REGISTRATION' }}</el-menu-item>
<el-menu-item index="/saiC">{{ language==0?'赛程安排':'COMPETITIONS' }}</el-menu-item>
<el-menu-item index="/meta">{{ language==0?'媒体中心':'MEDIA' }}</el-menu-item>
<el-menu-item index="/guide">{{ language==0?'参赛指南':'GUIDELINE' }}</el-menu-item>
<!-- <el-sub-menu index="/about">-->
<el-menu-item index="/notice">{{ language==0?'通知公告':'NOTICEBOARD' }}</el-menu-item>
<!-- <el-sub-menu index="/about">-->
<!-- <template #title>{{ language==0?'关于我们':'CONTACT & MORE' }}</template>-->
<!-- <el-menu-item index="/about/wuDao">{{ language==0?'舞蹈节':'About Us' }}</el-menu-item>-->
<!-- <el-menu-item index="/about/regulations" v-if="language==1">Rules & Regulations</el-menu-item>-->
......@@ -30,12 +31,13 @@
>
<el-menu-item index="/">{{ language==0?'首页':'HOME' }}</el-menu-item>
<el-menu-item index="/news">{{ language==0?'新闻资讯':'NEWS' }}</el-menu-item>
<el-menu-item index="/notice">{{ language==0?'通知公告':'NOTICEBOARD' }}</el-menu-item>
<el-menu-item index="/guide">{{ language==0?'参赛指南':'GUIDELINE' }}</el-menu-item>
<el-menu-item index="/match/list">{{ language==0?'大赛报名':'REGISTRATION' }}</el-menu-item>
<el-menu-item index="/saiC">{{ language==0?'赛程安排':'COMPETITIONS' }}</el-menu-item>
<el-menu-item index="/meta">{{ language==0?'媒体中心':'MEDIA' }}</el-menu-item>
<el-menu-item index="/guide">{{ language==0?'参赛指南':'GUIDELINE' }}</el-menu-item>
<!-- <el-sub-menu index="/about">-->
<el-menu-item index="/notice">{{ language==0?'通知公告':'NOTICEBOARD' }}</el-menu-item>
<!-- <el-sub-menu index="/about">-->
<!-- <template #title>{{ language==0?'关于我们':'CONTACT & MORE' }}</template>-->
<!-- <el-menu-item index="/about/wuDaoEn">{{ language==0?'舞蹈节':'About Us' }}</el-menu-item>-->
<!-- <el-menu-item index="/about/regulations" v-if="language==1">Rules & Regulations</el-menu-item>-->
......
......@@ -13,6 +13,7 @@ NProgress.configure({ showSpinner: false })
const whiteList = ['/login', '/register', '/regulations']
router.beforeEach((to, from, next) => {
console.log('to2', to)
NProgress.start()
if (getToken()) {
// debugger
......
......@@ -9,6 +9,7 @@ import useUserStore from '@/store/modules/user'
NProgress.configure({ showSpinner: false })
router.beforeEach((to, from, next) => {
console.log('to', to)
NProgress.start()
if (getToken()) {
// 判断当前用户是否已拉取完user_info信息
......
......@@ -500,6 +500,71 @@ export const constantRoutes = [
meta: { title: 'System messages' }
}
]
},
{
path: 'seat',
component: () => import('@/viewsPc/seat/seat'),
name: 'seat',
redirect: '/seat/detail',
children: [
{
path: 'detail',
name: 'seat_detail',
component: () => import('@/viewsPc/seat/ticket-detail'),
meta: { title: '购票详情' },
props: route => ({
activityId:route.query.id,
})
},
{
path: 'seat_picker',
name: 'seat_picker',
component: () => import('@/viewsPc/seat/seat-picker'),
meta: { title: '选座' },
props: route => ({
activityId:route.query.id,
})
},
{
path: 'order',
name: 'seat_order',
component: () => import('@/viewsPc/seat/order-list'),
meta: { title: '我的订单' },
props: route => ({
activityId:route.query.id,
})
},
{
path: 'order_detail',
name: 'order_detail',
component: () => import('@/viewsPc/seat/order-detail'),
meta: { title: '订单详情' },
props: route => ({
activityId: route.query.id,
})
},
{
path: 'confirm_order',
name: 'confirm_order',
component: () => import('@/viewsPc/seat/confirm-order'),
meta: { title: '确认订单' },
props: route => ({
activityId:route.query.id,
})
},
{
path: 'add_watch_people',
name: 'add_watch_people',
component: () => import('@/viewsPc/seat/add-watch-people'),
meta: { title: '新增观影人' }
},
{
path: 'people_manage',
name: 'people_manage',
component: () => import('@/viewsPc/seat/people-manage'),
meta: { title: '观影人管理' }
},
]
}
]
},
......
......@@ -108,6 +108,13 @@ const menus = ref([
isActive: false
},
{
name: language.value==0?'票务预订':'Ticket Reservation',
routeName: 'seat_order',
picUrl1: '/img/nav_29.png',
picUrl2: '/img/nav_29_dwn.png',
isActive: false
},
{
name: language.value==0?'系统消息':'System messages',
routeName: 'mySms',
picUrl1: '/img/nav_30.png',
......
......@@ -24,7 +24,8 @@
</el-form-item>
<el-form-item :label="language==0?'会员角色':'Role'">
<el-select v-model="labelArr" multiple style="width: 100px;">
<el-option v-for="l in labels" :key="l.value" :value="l.value" :label="language==0?(l.label):(l.enlabel)"/>
<el-option v-if="group.type=='4'" v-for="l in labels" :key="l.value" :value="l.value" :label="language==0?(l.label):(l.enlabel)"/>
<el-option v-else v-for="l in labelsForType4" :key="l.value" :value="l.value" :label="language==0?(l.label):(l.enlabel)"/>
</el-select>
</el-form-item>
<el-form-item :label="language==0?'WDSF':'WDSF'">
......@@ -73,6 +74,8 @@ import useUserStore from "@/store/modules/user";
import {useStorage} from "@vueuse/core/index";
import AddWdsf from "@/viewsPc/match/components/addWdsf";
const language= useStorage('language',0)
const group = useUserStore().group || {}
const tableData = ref([])
const labelArr = ref([])
const labels = ref([
......@@ -84,6 +87,15 @@ const labels = ref([
{value: '6', label: '官员', enlabel: 'Official'},
{value: '3', label: '其他', enlabel: 'Other'}
])
const labelsForType4 = ref([
{value: '0', label: '运动员', enlabel: 'Sportsman'},
{value: '1', label: '教练', enlabel: 'Coach'},
{value: '2', label: '领队', enlabel: 'Head of team'},
{value: '4', label: '管理', enlabel: 'Manager'},
{value: '5', label: '翻译', enlabel: 'Interpreter'},
{value: '6', label: '官员', enlabel: 'Official'},
{value: '3', label: '其他', enlabel: 'Other'}
])
const certificates = ref([
{
value: '0',
......@@ -102,7 +114,6 @@ const query = ref({
pageNum: 1, pageSize: 10
})
const total = ref(0)
const group = useUserStore().group || {}
const props = defineProps({
user: {
type: Object,
......@@ -193,6 +204,8 @@ function delperson(p) {
cancelButtonText: c,
type: 'warning'
}).then(() => {
// This user has registered for the event and cannot be deleted.
match.delPerson(p.id).then(res => {
ElMessage.success(msg)
getList(groupId.value)
......
......@@ -101,7 +101,8 @@ function popRemark(type){
building()
return
}
if((form.value.isJdView == 0&&type=='1') || (form.value.isCarView == 0&&type=='2') || (form.value.isFoodView == 0&&type=='3') || type=='0' || (form.value.isMealView == 0&&type=='4') || (type=='5'&&form.value.isPhotoView == 0)){
if((form.value.isJdView == 0&&type=='1') || (form.value.isCarView == 0&&type=='2') || (form.value.isFoodView == 0&&type=='3') || (form.value.isMealView == 0&&type=='4') || (type=='5'&&form.value.isPhotoView == 0)){
//type == '0'
building()
return
}
......@@ -116,8 +117,11 @@ function goBooking(n) {
switch (n) {
case 0:
// 票务
building()
router.push({path: `/booking/ticket/${props.matchId}`})
router.push({
path: `/seat/detail`,
params: {id: 1},
query: {id: 1}
})
break;
case 1:
//酒店
......
......@@ -96,8 +96,8 @@
<div class="content" v-if="activeName==8">
<label>点击下载:</label>
<!-- <a target="_blank" class="text-primary" href="/file/COMPETITION_GUIDE_0511V1.pdf">-->
<a @click="showBuilding" class="text-primary">
<a target="_blank" class="text-primary" href="/file/COMPETITION%20GUIDE%200520V1.pdf">
<!-- <a @click="showBuilding" class="text-primary">-->
<el-icon style="position: relative;top: 2px"><download/></el-icon>
2024 WDSF亚洲体育舞蹈节参赛指南
</a>
......@@ -200,8 +200,8 @@
<div class="content" v-if="activeName==71"><el-empty description="no data"></el-empty></div>
<div class="content" v-if="activeName==8">
<label>Download:</label>
<!-- <a target="_blank" class="text-primary" href="/file/COMPETITION_GUIDE_0511V1.pdf">-->
<a @click="showBuilding" class="text-primary">
<a target="_blank" class="text-primary" href="/file/COMPETITION%20GUIDE%200520V1.pdf">
<!-- <a @click="showBuilding" class="text-primary">-->
<el-icon style="position: relative;top: 2px"><download/></el-icon>
2024 WDSF ASIAN DANCESPORT FESTIVAL COMPETITION GUIDE
</a>
......
......@@ -4,7 +4,7 @@
<div class="box ph-30">
<el-card v-if="user">
<single-sign-step v-if="user.utype=='1'" activeStep="1" :language="language"/>
<team-sign-step v-if="user.utype=='2'" activeStep="2" :language="language"/>
<team-sign-step v-if="user.utype=='2'" :activeStep="1" :language="language"/>
</el-card>
<el-card class="mt20">
......@@ -73,10 +73,14 @@
<el-col :lg="12">
<el-card class="mt20" v-loading="loading">
<template #header>
<div class="card-header">
<div class="card-header" v-if="isNational">
<img src="@/assets/sign/tag03.png"/>
{{ language==0?'队医':'Team doctor' }}
</div>
<div class="card-header" v-else>
<img src="@/assets/sign/gl.png"/>
管理
</div>
</template>
<div class="chooseForm">
<el-checkbox-group v-model="form.doctor">
......@@ -198,7 +202,7 @@ import DialogAddCoach_En from './components/addCoach_en'
const {proxy} = getCurrentInstance()
const router = useRouter()
const route = useRoute()
import {ElMessage} from 'element-plus'
import {ElMessage, ElMessageBox} from 'element-plus'
import {useRoute, useRouter} from 'vue-router'
import useUserStore from "@/store/modules/user";
import {useStorage} from "@vueuse/core/index";
......@@ -242,7 +246,7 @@ onMounted(() => {
})
function getList() {
console.log(user.utype)
// console.log(user.utype)
if (user.utype == '1') {
geren()
}
......@@ -252,7 +256,7 @@ function getList() {
}
function changecoachs(e) {
console.log(e)
// console.log(e)
}
// 获取报名时是否已选过
......@@ -309,11 +313,31 @@ function geren() {
}
function goNext() {
console.log(form.value)
console.log(personAllList.value.teamDoctors,form.value)
// if ((form.value.coachs.length < 1) && (form.value.leader.length < 1)) {
// ElMessage.warning(language.value==0?'至少选一个教练或领队':'Coach/Team Leader, select at least one')
// return
// }
if((personAllList.value.coaches.length>=0 && form.value.coachs?.toString().length == 0)&&
(personAllList.value.teamDoctors.length>=0 && form.value.doctor?.toString().length == 0)&&
(personAllList.value.translators.length>=0 && form.value.translator?.toString().length == 0)&&
(personAllList.value.others.length>=0 && form.value.other?.toString().length == 0)&&
(personAllList.value.officials.length>=0 && form.value.official?.toString().length == 0)&&
(personAllList.value.leaders.length>=0 && form.value.leader?.toString().length == 0)
){
ElMessageBox.confirm(language.value==0?'您已添加随行人员,但尚未选中,是否进行下一步?':'You have added a follower, but have not selected, do you want to continue?', {
confirmButtonText: language.value==0?'下一步':'Next',
cancelButtonText: language.value==0?'取消':'Cancel',
type: 'warning'
}).then(()=>{
next()
})
return
}
next()
}
function next() {
var obj = {
cptId: matchId,
coachIds: form.value.coachs?.toString() || '',
......@@ -332,7 +356,6 @@ function goNext() {
if (user.utype == '1') {
// 个人报名
match.singleSignSavePerson(obj).then(res => {
console.log(res)
router.push({
name: 'chooseProject',
query: {
......@@ -357,11 +380,8 @@ function goNext() {
})
}
console.log(form.value)
}
function goPrev() {
console.log(languageSource.value)
if(languageSource.value=='100'){
router.push({
name: `teamSignCn`,
......
......@@ -38,7 +38,10 @@
<div class="text-center mt20">
<el-button type="primary" plain @click="switchPerson">{{language==0?'切换':'Switch'}}</el-button>
</div>
<div class="tip">
<span v-if="language==0">*如果您参加个人项目,或给其他组合/选手进行报名,请点击切换按钮重新选择人员</span>
<span v-else>*If you would like to register individual competitions for yourself or other couples/athletes, please click "Switch" button to re-select persons concerned.</span>
</div>
</div>
</div>
</el-col>
......@@ -46,7 +49,7 @@
<el-col :lg="18">
<div class="panel border">
<div class="panel-header ">
<h3 class="panel-title" v-if="language==0">可参与报名的项目</h3>
<h3 class="panel-title" v-if="language==0">可参与报名的项目 <span>已报项目在下方查看</span></h3>
<h3 class="panel-title" v-else>Search Events</h3>
<div class="fr">
<el-input size="small" v-model="projectQuery.name" :prefix-icon="Search" @change="getProjectList"
......@@ -59,7 +62,7 @@
<el-checkbox class="flexBetweenBox" v-for="c in projectList" :label="c.id" :key="c.id" :disabled="cantBao.flag">
<div class="flexBetween w100">
<div class="l">
{{ c.code }}:{{ c.name }}
{{ c.code }}:{{ c.name }} {{c.danceType}}
<div>{{ c.danceTypeDetailStr }}</div>
</div>
<div class="text-primary">{{ language == 0 ? '¥' : '€' }}{{ c.serviceFee }}</div>
......@@ -793,4 +796,8 @@ function switchTabletype() {
}
.mName{color: #000;font-size: 15px;display: inline-block;max-width: 6.5em;text-overflow: ellipsis;
overflow: hidden;}
.panel h3.panel-title{
span{ color: #999;font-size: 12px;}
}
</style>
......
......@@ -32,10 +32,10 @@
{{c.representing}}
{{c.ageGroup}}
{{c.division}}
{{c.division}}<span v-if="c.age"> -{{ c.age }}{{language==0 ? '岁' : 'years'}}</span>
<!-- @click="editPerson(c.id)"-->
<span v-if="c.disabled" class="text-danger po-right">需补全信息</span>
<!-- -{{ c.age }}-->
</div>
</el-option>
<!-- <template #tag>-->
......@@ -78,7 +78,9 @@
<el-col :lg="14">
<div class="panel border">
<div class="panel-header ">
<h3 class="panel-title" v-if="language==0">可参与报名的项目</h3>
<h3 class="panel-title" v-if="language==0">可参与报名的项目
<span>已报项目在下方查看</span>
</h3>
<h3 class="panel-title" v-else>Search Events</h3>
<div class="fr">
<el-input size="small" v-model="projectQuery.name" :prefix-icon="Search"
......@@ -91,7 +93,7 @@
<el-checkbox class="flexBetweenBox" v-for="c in projectList" :value="c.id" :key="c.id">
<div class="flexBetween w100">
<div class="l">
{{ c.code }}:{{ c.name }}
{{ c.code }}:{{ c.name }}({{c.danceType}})
<div>{{ c.danceTypeDetailStr }}</div>
</div>
<div class="text-primary">{{ language == 0 ? '¥' : '€' }}{{ c.serviceFee }}</div>
......@@ -868,4 +870,7 @@ watch(choosedchoosed, (newVal, oldVal) => {
}
:deep(.el-select__tags-text){color: #000;font-size: 14px;}
.po-right{position: absolute;right: 0;}
.panel h3.panel-title{
span{ color: #999;font-size: 13px;}
}
</style>
......
......@@ -164,7 +164,7 @@ const data = reactive({
{value: '0', label: '运动员', enlabel: 'Sportsman'},
{value: '1', label: '教练', enlabel: 'Coach'},
{value: '2', label: '领队', enlabel: 'Head Of Team'},
{value: '4', label: '队医', enlabel: 'Team doctor'},
{value: '4', label: '管理', enlabel: 'Team doctor'},
{value: '5', label: '翻译', enlabel: 'Interpreter'},
{value: '6', label: '官员', enlabel: 'Official'},
{value: '3', label: '其他', enlabel: 'Other'}
......
......@@ -4,9 +4,9 @@
<el-button type="primary" @click="addMember">
{{ language == 0 ? '添加选手' : 'Add Player' }}
</el-button>
<el-button type="primary" plain @click="importSportman" v-if="!isNational">
{{language == 0 ? '导入选手' : 'Import Player'}}
</el-button>
<!-- <el-button type="primary" plain @click="importSportman" v-if="!isNational">-->
<!-- {{language == 0 ? '导入选手' : 'Import Player'}}-->
<!-- </el-button>-->
</div>
<div class="from-Card">
<el-form :inline="true" :model="query" class="mt20" label-width="60" size="small">
......
......@@ -25,7 +25,8 @@
</el-col>
<el-col :lg="8">
<div class="item">
<label>{{ language == 0 ? '队医' : 'TEAM DOCTOR' }}</label>
<label v-if="group.type=='4'">{{ language == 0 ? '队医' : 'TEAM DOCTOR' }}</label>
<label v-else>{{ language == 0 ? '管理' : 'MANAGER' }}</label>
<span class="mr5" v-for="c in names.teamDoctorList">
{{ c.realName }},
</span>
......
......@@ -43,7 +43,11 @@
</div>
<div v-else>
<div>{{ scope.row.birthPeriod.replace(',',language==0?' 至 ':' to ') }}</div>
<div>{{scope.row.birthPeriodSecond?.replace(',',language==0?' 至 ':' to ')}}</div>
<div v-if="scope.row.birthPeriodSecond">{{scope.row.birthPeriodSecond?.replace(',',language==0?' 至 ':' to ')}}</div>
<div v-if="scope.row.birthPeriodThird">{{scope.row.birthPeriodThird?.replace(',',language==0?' 至 ':' to ')}}</div>
<div v-if="scope.row.birthPeriodFourth">{{scope.row.birthPeriodFourth?.replace(',',language==0?' 至 ':' to ')}}</div>
<div v-if="scope.row.birthPeriodFifth">{{scope.row.birthPeriodFifth?.replace(',',language==0?' 至 ':' to ')}}</div>
<div v-if="scope.row.birthPeriodSixth">{{scope.row.birthPeriodSixth?.replace(',',language==0?' 至 ':' to ')}}</div>
</div>
</template>
</el-table-column>
......
......@@ -27,7 +27,12 @@
<span v-if="item==='0'" class="ml5">{{ language == 0 ? '运动员' : 'Athletes' }}</span>
<span v-if="item==='1'" class="ml5">{{ language == 0 ? '教练' : 'Coach' }}</span>
<span v-if="item==='2'" class="ml5">{{ language == 0 ? '领队' : 'Head of team' }}</span>
<span v-if="item==='4'" class="ml5">{{ language == 0 ? '队医' : 'Team Doctor' }}</span>
<span v-if="item==='4'&&group.type!='4'" class="ml5">
{{ language == 0 ? '管理' : 'Manager' }}
</span>
<span v-if="item==='4'&&group.type=='4'" class="ml5">
{{ language == 0 ? '队医' : 'Team Doctor' }}
</span>
<span v-if="item==='5'" class="ml5">{{ language == 0 ? '翻译' : 'Interpreter' }}</span>
<span v-if="item==='6'" class="ml5">{{ language == 0 ? '官员' : 'Official' }}</span>
<span v-if="item==='3'" class="ml5">{{ language == 0 ? '其他' : 'Other' }}</span>
......@@ -61,7 +66,8 @@
<script setup>
import {ref} from "vue";
import {useStorage} from "@vueuse/core/index";
import useUserStore from "@/store/modules/user";
const group = useUserStore().group || {}
const language = useStorage('language', 0)
const emit = defineEmits(['edit', 'delete'])
let title = ''
......
......@@ -4,22 +4,22 @@
</div>
<el-table :data="list" :sum-text="sumText" border style="width: 100%" v-loading="loading">
<el-table-column :label="language==0?'序号':'Index'" type="index" width="70" align="center"/>
<el-table-column v-if="!isNational" :label="language==0?'姓名':'Real Name'" prop="personInfo.realName" min-width="100"/>
<el-table-column v-if="!isNational" :label="language==0?'姓名':'Real Name'" prop="personInfo.realName" align="center" min-width="100"/>
<el-table-column v-if="isNational" :label="language==0?'姓氏':'Surname'" prop="personInfo.xing" min-width="100"/>
<el-table-column v-if="isNational" :label="language==0?'名':'Name'" prop="personInfo.ming" min-width="100"/>
<el-table-column :label="language==0?'所属国家/地区':'Country'" min-width="120">
<el-table-column :label="language==0?'所属国家/地区':'Country'" min-width="120" header-align="center" align="center">
<template #default="scope">
<span v-if="scope.row.personInfo.countryName">{{scope.row.personInfo.countryName}}</span>
<span v-if="scope.row.personInfo.representing">{{scope.row.personInfo.representing}}</span>
</template>
</el-table-column>
<el-table-column :label="language==0?'性别':'Gender'" prop="personInfo.sexStr"/>
<el-table-column v-if="!isNational" :label="language==0?'证件类型':'ID Type'" :width="language==0?'':'140'" prop="personInfo.idcTypeStr"/>
<el-table-column v-if="!isNational" :label="language==0?'证件号码':'ID NO.'" prop="personInfo.idcCode" width="200"/>
<el-table-column v-if="isNational" :label="language==0?'WDSF 会员号':'WDSF MIN'" prop="personInfo.wdsfMin" width="200"/>
<el-table-column v-if="!isNational" :label="language==0?'出生日期':'Date of Birth'" prop="personInfo.birth" width="130"/>
<el-table-column v-if="isNational" :label="language==0?'年龄组':'Age group'" prop="personInfo.ageGroup" width="110"/>
<el-table-column v-if="isNational" :label="language==0?'舞种':'Division'" prop="personInfo.division" width="110"/>
<el-table-column :label="language==0?'性别':'Gender'" prop="personInfo.sexStr" align="center"/>
<el-table-column v-if="!isNational" :label="language==0?'证件类型':'ID Type'" align="center" :width="language==0?'':'140'" prop="personInfo.idcTypeStr" header-align="center"/>
<el-table-column v-if="!isNational" :label="language==0?'证件号码':'ID NO.'" prop="personInfo.idcCode" width="200" header-align="center"/>
<el-table-column v-if="isNational" :label="language==0?'WDSF 会员号':'WDSF MIN'" prop="personInfo.wdsfMin" width="200" header-align="center"/>
<el-table-column v-if="!isNational" :label="language==0?'出生日期':'Date of Birth'" align="center" prop="personInfo.birth" width="130" header-align="center"/>
<el-table-column v-if="isNational" :label="language==0?'年龄组':'Age group'" prop="personInfo.ageGroup" width="110" header-align="center"/>
<el-table-column v-if="isNational" :label="language==0?'舞种':'Division'" prop="personInfo.division" width="110" header-align="center"/>
<!-- <el-table-column :label="language==0?'会员角色':'Role'" width="150">-->
<!-- <template #default="scope">-->
<!-- <div class="esp">-->
......@@ -36,7 +36,7 @@
<!-- </template>-->
<!-- </el-table-column>-->
<!-- <el-table-column :label="language==0?'详细地址':'Detailed Address'" prop="personInfo.address" min-width="140"/>-->
<el-table-column :label="language==0?'报项':'REGISTERED COMPETITION'" min-width="300" :fixed="hasAction?false:'right'">
<el-table-column :label="language==0?'报项':'REGISTERED COMPETITION'" min-width="300" header-align="center" :fixed="hasAction?false:'right'">
<template #default="props">
<ol>
<li v-for="s in props.row.signInfo">
......@@ -51,7 +51,7 @@
</ol>
</template>
</el-table-column>
<el-table-column :fixed="hasAction?false:'right'" min-width="100" :label="language==0?'保险费':'Premium'" prop="insuranceFee">
<el-table-column :fixed="hasAction?false:'right'" min-width="100" align="center" :label="language==0?'保险费':'Premium'" prop="insuranceFee">
<template #default="scope">
<span class="text-primary">{{ language==0?'¥':'€' }}{{ scope.row.insuranceFee }}</span>
</template>
......@@ -61,11 +61,11 @@
<template #default="scope">
<el-link v-if="scope.row.signInfo[0].extraPersonInfoMapList[index]?.type=='2'"
target="_blank"
:href="fillImgUrl(scope.row.signInfo[0].extraPersonInfoMapList[index].value.url)">
<span class="text-primary">{{ scope.row.signInfo[0].extraPersonInfoMapList[index].value.name }}</span>
:href="fillImgUrl(scope.row.signInfo[0].extraPersonInfoMapList[index]?.value?.url)">
<span class="text-primary">{{ scope.row.signInfo[0].extraPersonInfoMapList[index]?.value?.name }}</span>
</el-link>
<img v-else-if="scope.row.signInfo[0].extraPersonInfoMapList[index]?.type=='3'" style="width: 50px;"
:src="fillImgUrl(scope.row.signInfo[0].extraPersonInfoMapList[index].value.url||scope.row.signInfo[0].extraPersonInfoMapList[index].value)">
:src="fillImgUrl(scope.row.signInfo[0].extraPersonInfoMapList[index]?.value?.url||scope.row.signInfo[0]?.extraPersonInfoMapList[index]?.value)">
<span v-else>{{ scope.row.signInfo[0].extraPersonInfoMapList[index]?.value }}</span>
</template>
</el-table-column>
......
......@@ -2,22 +2,35 @@
<div class="mt20"></div>
<el-table :data="list" border style="width: 100%">
<el-table-column :label="language==0?'序号':'Index'" type="index" width="70" align="center"/>
<el-table-column :label="language==0?'组别代码':'EVENT code'" width="120px" prop="project.code"/>
<el-table-column :label="language==0?'组别':'EVENT'" prop="project.name"/>
<el-table-column :label="language==0?'舞种':'DISCIPLINE'" width="120px" prop="project.danceType"/>
<el-table-column :label="language==0?'参赛说明':'Participation Instructions'" min-width="160px">
<el-table-column :label="language==0?'组别代码':'EVENT code'" width="120px" align="center" prop="project.code"/>
<el-table-column :label="language==0?'组别':'EVENT'" min-width="150px" header-align="center" prop="project.name">
<template #default="scope">
<div v-html="scope.row.project.remarks"></div>
<el-tooltip effect="dark" :content="scope.row.project.name">
<div class="esp">{{scope.row.project.name}}</div>
</el-tooltip>
</template>
</el-table-column>
<el-table-column :label="language==0?'参赛运动员':'PARTICIPATING ATHLETES'" min-width="140px">
<el-table-column :label="language==0?'舞种':'DISCIPLINE'" align="center" width="120px" prop="project.danceType"/>
<el-table-column :label="language==0?'参赛说明':'Participation Instructions'" header-align="center" min-width="160px">
<template #default="scope">
<div>
<el-tooltip effect="dark" :content="scope.row.project.remarks">
<div class="esp" v-html="scope.row.project.remarks"></div>
</el-tooltip>
</template>
</el-table-column>
<el-table-column :label="language==0?'参赛运动员':'PARTICIPATING ATHLETES'" header-align="center" min-width="140px">
<template #default="scope">
<el-tooltip effect="dark">
<template #content>
<span v-for="s in scope.row.athletes">{{ s.name }},</span>
</template>
<div class="esp">
<span v-for="s in scope.row.athletes">{{ s.name }},</span>
</div>
</el-tooltip>
</template>
</el-table-column>
<el-table-column :label="language==0?'参赛服务费':'REGISTRATION FEE'" width="150px" prop="">
<el-table-column :label="language==0?'参赛服务费':'REGISTRATION FEE'" align="center" width="150px" prop="">
<template #default="scope">
<div class="text-primary">
{{ language==0?'¥':'€' }}{{ scope.row.project.serviceFee }}
......
......@@ -116,8 +116,10 @@
</el-col>
<el-col :lg="12" v-if="Number(form.totalFee)>0">
<div class="priceb" v-if="form.payStatus=='0'">{{ language==0?'待支付金额':'Amount Due' }}:<span class="price">{{ language==0?'¥':'€' }}{{ Number(totalFee).toFixed(2) }}</span></div>
<div class="priceb" v-if="form.payStatus=='1'">{{ language==0?'已支付金额':'Amount Due' }}:<span class="price">{{ language==0?'¥':'€' }}{{ Number(totalFee).toFixed(2) }}</span></div>
<div class="priceb" v-if="form.payStatus=='5'">{{ language==0?'已退款':'Refunded' }}:<span class="price">{{ language==0?'¥':'€' }}{{ Number(totalFee).toFixed(2) }}</span></div>
<div class="priceb" v-else-if="form.payStatus=='1'">{{ language==0?'线下支付待核销':'Amount Due' }}:<span class="price">{{ language==0?'¥':'€' }}{{ Number(totalFee).toFixed(2) }}</span></div>
<div class="priceb" v-else-if="form.payStatus=='3'">{{ language==0?'已支付金额':'Amount Due' }}:<span class="price">{{ language==0?'¥':'€' }}{{ Number(totalFee).toFixed(2) }}</span></div>
<div class="priceb" v-else-if="form.payStatus=='5'">{{ language==0?'已退款':'Refunded' }}:<span class="price">{{ language==0?'¥':'€' }}{{ Number(totalFee).toFixed(2) }}</span></div>
<div class="priceb" v-else>{{ language==0?'费用总计':'Amount Due' }}:<span class="price">{{ language==0?'¥':'€' }}{{ Number(totalFee).toFixed(2) }}</span></div>
</el-col>
</el-row>
</el-card>
......
......@@ -23,7 +23,7 @@
</el-form-item>
</el-col>
<el-col :lg="10">
<el-form-item :label="language==0?'代表国家/地区':'Representing'">
<el-form-item :label="language==0?'代表国家/地区':'Representing'" required>
<el-select filterable v-model="form.countryId" @change="changeCountryId"
:disabled="form.type!='4'">
<!-- <el-option v-for="item in countryList" :key="item.id" :label="language==0?item.name:item.enName" :value="item.id"/>-->
......
......@@ -26,7 +26,7 @@
<el-form-item :label="language==0?'参赛队名称':'Name of participating team'" required prop="abreviations">
<el-input type="text" v-model="form.abreviations" :placeholder="language==0?'请输入内容':''"/>
</el-form-item>
<el-form-item :label="language==0?'团体名称':'Team Name'" prop="name">
<el-form-item :label="language==0?'团体名称':'Team Name'" prop="name" required>
<el-input v-model="form.name" :placeholder="language==0?'请输入团体名称':''" />
</el-form-item>
<el-form-item :label="language==0?'所属国家/地区':'Country'" required>
......@@ -43,12 +43,12 @@
<el-form-item :label="language==0?'邮箱':'Email'" required prop="contactEmail">
<el-input v-model="form.contactEmail" type="email" :placeholder="language==0?'请输入内容':''"/>
</el-form-item>
<!-- <el-form-item :label="language==0?'专业/业余':'Professional/Amateur'" required prop="majorFlag">-->
<!-- <el-select v-model="form.majorFlag">-->
<!-- <el-option :label="language==0?'专业':'Professional'" value="1" />-->
<!-- <el-option :label="language==0?'业余':'Amateur'" value="0" />-->
<!-- </el-select>-->
<!-- </el-form-item>-->
<el-form-item :label="language==0?'专业/业余':'Professional/Amateur'" required prop="majorFlag">
<el-select v-model="form.majorFlag">
<el-option :label="language==0?'专业':'Professional'" value="1" />
<el-option :label="language==0?'业余':'Amateur'" value="0" />
</el-select>
</el-form-item>
<el-form-item :label="language==0?'团体类型':'Group type'" prop="type">
<el-select :disabled="form.type=='4'" v-model="form.type" :placeholder="typeOptions[language].selectPlaceholder" style="width: 100%;">
<el-option v-for="(o,index) in typeOptions[language].options" :label="o.text"
......
<script setup>
import { ElMessage } from "element-plus";
import { addViewPeople } from "./api/index.js";
import { languageFormat } from "./utils/language.js";
import { useStorage } from "@vueuse/core/index";
const language = useStorage("language", 0);
const router = useRouter();
const people = reactive({
form: {
name: "",
idCard: "",
},
type: language.value == 0 ? "身份证" : "Identity Card",
onConfirm() {
if (!people.form.name)
return ElMessage({
type: "warning",
message: languageFormat(language.value, "请输入姓名", "Name"),
});
if (!people.form.idCard)
return ElMessage({
type: "warning",
message: languageFormat(language.value, "请输入证件号", "ID Numbe"),
});
// 使用正则验证身份证号码格式
const idCardRegex =
/^[1-9]\d{5}(19|20)\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\d{3}[\dXx]$/;
if (!idCardRegex.test(people.form.idCard) && language.value == 0)
return ElMessage({ type: "warning", message: "身份证号格式不正确" });
addViewPeople(people.form).then((res) => {
ElMessage({
type: "success",
message: languageFormat(language.value, "操作成功", "Operate successfully"),
});
router.go(-2);
});
},
});
</script>
<template>
<div class="container">
<div class="title">
{{ languageFormat(language, "新增观影人", "Companion") }}
</div>
<div class="content">
<div class="form-item">
<div>
<div class="label">
{{ languageFormat(language, "姓名", "Full Name") }}
</div>
<el-input
v-model="people.form.name"
style="width: 570px"
:placeholder="language == 0 ? '请输入姓名' : 'Nama'"
/>
</div>
<div>
<div class="label">
{{ languageFormat(language, "证件类型", "Type of Document") }}
</div>
<el-input
v-model="people.type"
style="width: 570px"
placeholder="Please input"
readonly
/>
</div>
</div>
<div class="form-item">
<div>
<div class="label">
{{ languageFormat(language, "身份证号", "Identity Card") }}
</div>
<el-input
v-model="people.form.idCard"
style="width: 570px"
:placeholder="language == 0 ? '请输入身份证号' : 'ID Numbe'"
/>
</div>
</div>
</div>
<div class="footer">
<div class="can_pay">
{{ languageFormat(language, "取消", "Cancel") }}
</div>
<div class="pay" @click="people.onConfirm()">
{{ languageFormat(language, "确认", "Confirm") }}
</div>
</div>
</div>
</template>
<style scoped lang="scss">
div {
box-sizing: border-box;
}
.container {
padding: 20px 0;
width: 1200px;
margin: 0 auto;
.title {
padding: 11px;
text-align: center;
background: linear-gradient(270deg, #493ceb 0%, #8623fc 100%);
font-size: 18px;
color: #ffffff;
}
.content {
padding: 46px 20px 24px;
background-color: #fff;
:deep(.el-input) {
height: 48px;
border-radius: 24px !important;
}
.form-item {
display: flex;
gap: 20px;
margin-bottom: 36px;
&:last-child {
margin: 0;
}
.label {
font-size: 18px;
color: #333333;
margin-bottom: 16px;
}
}
}
.footer {
display: flex;
justify-content: center;
align-items: center;
gap: 20px;
height: 70px;
background-color: #fff;
margin-top: 12px;
.pay {
width: 200px;
height: 40px;
background: linear-gradient(270deg, #493ceb 0%, #8623fc 100%);
border-radius: 20px;
font-weight: 500;
font-size: 16px;
color: #ffffff;
line-height: 40px;
text-align: center;
cursor: pointer;
}
.can_pay {
width: 200px;
height: 40px;
background: #f6f6f6;
border-radius: 20px;
font-weight: 500;
font-size: 16px;
color: #999;
line-height: 40px;
text-align: center;
box-sizing: border-box;
cursor: pointer;
}
}
}
</style>
import request from "../utils/request";
export const loginFree = (data) => request("POST", "/login/loginFree", data);
/** 活动详情 */
export const activityDetail = (data) =>
request("GET", `/api/activity/detail/${data.actId}`, data);
/** 场次详情 */
export const sessionDetail = (data) =>
request("GET", `/api/activity/sessionDetail/${data.actId}`, data);
/** 获取场馆信息 */
export const getSitePlaceInfo = (data) =>
request("GET", `/api/activity/getSitePlaceInfo`, data);
/** 获取票档信息 */
export const getPriceLevelInfo = (data) =>
request("GET", `/api/activity/getPriceLevelInfo`, data);
/** 获取座位信息 */
export const getSiteConfig = (data) =>
request("GET", `/api/activity/getSiteConfig`, data);
/** 确认订单 */
export const confirmOrder = (data) =>
request("POST", `/api/order/confirmOrder`, data);
/** 订单支付 */
export const payOrder = (data) =>
request("POST", `/api/order/payment`, data);
/** 观众列表 */
export const viewPeopleList = (data) =>
request("GET", `/api/customer/list`, data);
/** 删除观众 */
export const deleteViewPeople = (data) =>
request("POST", `/api/customer/delete/${data.id}`, data);
/** 新增观众 */
export const addViewPeople = (data) =>
request("POST", `/api/customer/add`, data);
/** 订单列表 */
export const getOrderList = (data) =>
request("GET", `/api/order/list`, data);
/** 立即支付 */
export const immediatePay = (data) =>
request("POST", `/api/order/immediatePay`, data);
/** 取消支付 */
export const cancelPay = (data) =>
request("POST", `/api/order/cancelPay/${data.orderSn}`, data);
/** 退单 */
export const cancelOrder = (data) =>
request("POST", `/api/order/cancelOrder/${data.orderSn}`, data);
/** 订单详情 */
export const getOrderDetail = (data) =>
request("GET", `/api/order/detail/${data.orderSn}`, data);
/** 检查是否支付成功 */
export const checkPaySuccess = (data) =>
request("POST", `/api/order/checkOrderIsPay/${data.orderSn}`, data);
<script setup>
const props = defineProps({
showCodeDialog: {
type: Boolean,
default: false,
},
qrCode: {
type: String,
default: "",
},
});
const emit = defineEmits(["closeDialog"]);
const handleCloce = () => {
emit("closeDialog", false);
};
</script>
<template>
<div>
<el-dialog
v-model="props.showCodeDialog"
title="支付"
width="300"
:before-close="handleCloce()"
>
<div>
<img class="qrcode" :src="props.qrCode" />
</div>
</el-dialog>
</div>
</template>
<style scoped lang="scss">
.qrcode {
width: 150px;
height: 150px;
background-color: #8623fc;
margin: 0 auto;
}
</style>
<script setup>
import { deleteViewPeople, viewPeopleList } from "./api/index.js";
import { ElMessageBox, ElMessage } from "element-plus";
import { languageFormat } from "./utils/language.js";
import { useStorage } from "@vueuse/core/index";
const language = useStorage("language", 0);
const audience = reactive({
data: [],
fetchData() {
viewPeopleList().then((res) => {
audience.data = res.data;
});
},
deletePeople(id) {
ElMessageBox.confirm(
languageFormat(
language.value,
"确认删除该观看人吗?",
"Are you sure to delete this viewer?"
),
languageFormat(language.value, "提示", "Reminder"),
{
confirmButtonText: languageFormat(language.value, "确认", "confirm"),
cancelButtonText: languageFormat(language.value, "取消", "cancel"),
type: "warning",
draggable: true,
}
)
.then(() => {
deleteViewPeople({ id }).then(() => {
audience.fetchData();
ElMessage({
type: "success",
message: languageFormat(
language.value,
"操作成功",
"Operate successfully"
),
});
});
})
.catch(() => {});
},
});
audience.fetchData();
</script>
<template>
<div class="container">
<div class="title">
<div
class="add_btn"
@click="$router.push({ path: '/seat/add_watch_people' })"
>
{{ languageFormat(language, "新增", "Add") }}
</div>
{{ languageFormat(language, "观影人管理", "Viewers") }}
</div>
<div class="content">
<div class="people_box">
<div
v-for="(it, index) in audience.data"
:key="index"
class="people_item"
>
<div class="name">{{ it.name }}</div>
<div class="idcard">
{{ languageFormat(language, "身份证", "Identity Card") }}{{
it.idCard
}}
</div>
<div class="btn" @click="audience.deletePeople(it.id)">
{{ languageFormat(language, "删除", "delete") }}
</div>
</div>
</div>
</div>
</div>
</template>
<style scoped lang="scss">
div {
box-sizing: border-box;
}
.container {
padding: 20px 0;
width: 1200px;
margin: 0 auto;
.title {
position: relative;
padding: 11px;
text-align: center;
background: linear-gradient(270deg, #493ceb 0%, #8623fc 100%);
font-size: 18px;
color: #ffffff;
.add_btn {
position: absolute;
left: 20px;
top: 50%;
transform: translateY(-50%);
width: 68px;
height: 24px;
border-radius: 12px;
border: 1px solid #ffffff;
font-weight: 400;
font-size: 12px;
color: #ffffff;
text-align: center;
line-height: 24px;
box-sizing: border-box;
user-select: none;
cursor: pointer;
}
}
.content {
min-height: 590px;
background-color: #fff;
box-shadow: 0px 0px 46px 0px rgba(1, 16, 64, 0.08);
padding: 20px;
.people_box {
display: flex;
flex-wrap: wrap;
gap: 20px;
.people_item {
width: 275px;
height: 137px;
background: #ffffff;
border: 1px solid #dcdfe6;
padding: 16px;
.name {
font-weight: 600;
font-size: 16px;
color: #2d373f;
line-height: 22px;
}
.idcard {
font-size: 16px;
color: #95a1a6;
line-height: 22px;
margin-top: 12px;
margin-bottom: 17px;
}
.btn {
width: 69px;
height: 32px;
background: #e7e6ff;
font-weight: 400;
font-size: 16px;
color: #493ceb;
line-height: 32px;
text-align: center;
cursor: pointer;
user-select: none;
}
}
}
}
}
</style>
<script setup></script>
<template>
<div class="view">
<router-view />
</div>
</template>
<style scoped lang="scss">
.view {
min-width: 1024px;
max-width: 1920px;
margin: 0 auto;
}
</style>
export const languageFormat = (language = 0, zh, en) => {
return language == 1 ? en : zh;
};
/** 用户登录token储存的key */
export const TOKEN_KEY = "SEAT_TOKEN";
/** 设置token */
export const setToken = (token) => localStorage.setItem(TOKEN_KEY, token);
/**
* 获取登录token
* @param drop 是否清空
*/
export const getToken = (drop = false) => {
let token = localStorage.getItem(TOKEN_KEY);
if (!token) return null;
if (drop) localStorage.removeItem(TOKEN_KEY);
return token;
};
// http.js
// import axios from "axios";
import axios from 'axios/dist/axios'
import { getToken } from "./local-store";
import { ElMessage } from "element-plus";
import { useStorage } from "@vueuse/core/index";
const language = useStorage("language", 0);
const baseURL = "https://radv4.gitliuyi.top/ticket"; //"http://book.xiaojinyu.games"; // 这里填入你的基础 API URL
const timeout = 15000; // 请求超时时间
const http = axios.create({
baseURL,
timeout,
headers: {
"Content-Type": "application/json",
},
});
// 请求拦截器
http.interceptors.request.use(
(config) => {
// 在发送请求之前做些什么
if (language.value == 1) config.headers.Language = "en-us";
const TOKEN = getToken();
if (TOKEN) config.headers.Authorization = TOKEN;
if (config.method == "get") config.params = config.data;
console.log("config", config);
return config;
},
(error) => {
return Promise.reject(error);
}
);
// 响应拦截器
http.interceptors.response.use(
(response) => {
// 判断是否有异常
let error = null; // 若无异常此值为null
if (response.status !== 200) {
error = Error(`Request failed with statuCode ${response.status}`);
}
if (response.data.code != 200) {
ElMessage({ type: "error", message: response.data.msg });
return Promise.reject(response.data);
}
return response.data;
},
(error) => {
// 对响应错误做点什么
return Promise.reject(error);
}
);
// 封装请求函数
const request = (method, url, data = null) => {
return http({
method,
url,
data,
});
};
export default request;
......@@ -65,25 +65,25 @@ export default defineConfig(({ mode, command }) => {
// https://cn.vitejs.dev/config/#server-proxy
'/dev-api/ztx-train': {
// target: 'http://123.60.96.243:1896/stage-api',
target: 'http://192.168.1.25:8686',
target: 'https://jijin.wtwuxicenter.com/stage-api',
changeOrigin: true,
rewrite: (p) => p.replace(/^\/dev-api\/ztx-train/, '')
},
'/dev-api/ztx-match': {
target: 'http://192.168.1.118:8083',
// target: 'http://192.168.1.132:8081',
// target: 'http://192.168.1.118:8083',
target: 'https://jijin.wtwuxicenter.com/stage-api',
changeOrigin: true,
rewrite: (p) => p.replace(/^\/dev-api\/ztx-match/, '')
},
'/dev-api/ztx-webSite': {
// target: 'https://dance.itechtop.cn/stage-api',
target: 'http://192.168.1.118:8081/',
target: 'https://jijin.wtwuxicenter.com/stage-api',
changeOrigin: true,
rewrite: (p) => p.replace(/^\/dev-api\/ztx-webSite/, '')
},
'/dev-api': {
target: 'http://192.168.1.131:8081/',
// target: 'https://dance.itechtop.cn/stage-api',
// target: 'http://192.168.1.118:8081/',
target: 'https://jijin.wtwuxicenter.com/stage-api',
// target: 'https://wdsfwuxicenter.com/stage-api',
changeOrigin: true,
rewrite: (p) => p.replace(/^\/dev-api/, '')
......
Styling with Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!