3877470c by 杨炀

1. 签证服务 登录后使用

2. 签证服务-关于护照上传的修改
1 parent dcc48c2b
...@@ -88,7 +88,7 @@ export function countryList() { ...@@ -88,7 +88,7 @@ export function countryList() {
88 } 88 }
89 export function associationList() { 89 export function associationList() {
90 return request({ 90 return request({
91 url: `/system/association/getList`, 91 url: `/system/mna/getList`,
92 method: 'get' 92 method: 'get'
93 }) 93 })
94 } 94 }
......
...@@ -29,14 +29,14 @@ ...@@ -29,14 +29,14 @@
29 ref="imageUpload" 29 ref="imageUpload"
30 :multiple="limit > 1" 30 :multiple="limit > 1"
31 :action="actionUrl || uploadImgUrl" 31 :action="actionUrl || uploadImgUrl"
32 list-type="picture-card" 32 :list-type="listType"
33 :on-success="handleUploadSuccess" 33 :on-success="handleUploadSuccess"
34 :before-upload="handleBeforeUpload" 34 :before-upload="handleBeforeUpload"
35 :limit="limit" 35 :limit="limit"
36 :on-error="handleUploadError" 36 :on-error="handleUploadError"
37 :on-exceed="handleExceed" 37 :on-exceed="handleExceed"
38 :before-remove="handleDelete" 38 :before-remove="handleDelete"
39 :show-file-list="true" 39 :show-file-list="showFileList"
40 :headers="headers" 40 :headers="headers"
41 :on-preview="handlePictureCardPreview" 41 :on-preview="handlePictureCardPreview"
42 :file-list="fileListInUpload" 42 :file-list="fileListInUpload"
...@@ -45,7 +45,13 @@ ...@@ -45,7 +45,13 @@
45 :disabled="disabled" 45 :disabled="disabled"
46 :accept="accept" 46 :accept="accept"
47 > 47 >
48 <el-icon class="avatar-uploader-icon"><plus /></el-icon> 48 <el-icon v-if="listType=='picture-card'" class="avatar-uploader-icon"><plus /></el-icon>
49 <el-link v-else class="mr10" type="primary">
50 <el-icon>
51 <Upload/>
52 </el-icon>
53 {{ buttonText }}
54 </el-link>
49 </el-upload> 55 </el-upload>
50 </el-row> 56 </el-row>
51 57
...@@ -98,6 +104,10 @@ const props = defineProps({ ...@@ -98,6 +104,10 @@ const props = defineProps({
98 type: String, 104 type: String,
99 default: 'image' 105 default: 'image'
100 }, 106 },
107 listType: {
108 type: String,
109 default: 'picture-card'
110 },
101 // 文件类型, 例如['png', 'jpg', 'jpeg'] 111 // 文件类型, 例如['png', 'jpg', 'jpeg']
102 fileType: { 112 fileType: {
103 type: Array, 113 type: Array,
...@@ -112,9 +122,17 @@ const props = defineProps({ ...@@ -112,9 +122,17 @@ const props = defineProps({
112 type: Boolean, 122 type: Boolean,
113 default: false 123 default: false
114 }, 124 },
125 showFileList: {
126 type: Boolean,
127 default: true
128 },
115 action: { 129 action: {
116 type: String, 130 type: String,
117 default: '' 131 default: ''
132 },
133 buttonText:{
134 type: String,
135 default: '上传文件'
118 } 136 }
119 }) 137 })
120 const actionUrl = computed(() => { 138 const actionUrl = computed(() => {
......
...@@ -168,6 +168,14 @@ function popRemark(type) { ...@@ -168,6 +168,14 @@ function popRemark(type) {
168 ElMessage.warning('请切换英文页面办理') 168 ElMessage.warning('请切换英文页面办理')
169 return 169 return
170 } else { 170 } else {
171 if (!user) {
172 ElMessage({
173 type: 'warning',
174 message: language.value == 0 ? '请先登录' : 'Please log in first',
175 })
176 return
177 }
178
171 applyInvitation() 179 applyInvitation()
172 return 180 return
173 } 181 }
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
8 8
9 <div class="text-center pd20" v-if="showR"> 9 <div class="text-center pd20" v-if="showR">
10 <img class="mauto" src="@/assets/dance/ok.png"/> 10 <img class="mauto" src="@/assets/dance/ok.png"/>
11 <!-- 提交成功等待审核--> 11 <!-- 提交成功等待审核-->
12 <h3 v-if="form.status"> 12 <h3 v-if="form.status">
13 <span v-if="form.status==0">In Approval</span> 13 <span v-if="form.status==0">In Approval</span>
14 <span v-if="form.status==1">Approved</span> 14 <span v-if="form.status==1">Approved</span>
...@@ -21,7 +21,7 @@ ...@@ -21,7 +21,7 @@
21 </h4> 21 </h4>
22 </div> 22 </div>
23 23
24 <el-form :model="form" :rules="rules" ref="iformRef" label-position="top" v-else> 24 <el-form :model="form" :rules="rules" ref="iformRef" label-position="top" v-else>
25 <el-form-item :label="language==0?'申请人类别':'Applicant Type'" required prop="applicatType"> 25 <el-form-item :label="language==0?'申请人类别':'Applicant Type'" required prop="applicatType">
26 <el-select v-model="form.applicatType"> 26 <el-select v-model="form.applicatType">
27 <el-option label="MNA" value="1"/> 27 <el-option label="MNA" value="1"/>
...@@ -40,19 +40,21 @@ ...@@ -40,19 +40,21 @@
40 </el-form-item> 40 </el-form-item>
41 <el-form-item :label="language==0?'是否需要中文邀请函':'Chinese Invitation'" required prop="chinese"> 41 <el-form-item :label="language==0?'是否需要中文邀请函':'Chinese Invitation'" required prop="chinese">
42 <el-radio-group v-model="form.chinese"> 42 <el-radio-group v-model="form.chinese">
43 <el-radio :value="1">{{ language==0?'是':'Yes' }}</el-radio> 43 <el-radio :value="1">{{ language == 0 ? '是' : 'Yes' }}</el-radio>
44 <el-radio :value="0">{{ language==0?'否':'No' }}</el-radio> 44 <el-radio :value="0">{{ language == 0 ? '否' : 'No' }}</el-radio>
45 </el-radio-group> 45 </el-radio-group>
46 </el-form-item> 46 </el-form-item>
47 47
48 <!-- 一般信息--> 48 <!-- 一般信息-->
49 <el-form-item :label="language==0?'国家/地区协会名':'MNA/Team Name'" :required="form.applicatType!=2" prop="associationCode"> 49 <el-form-item :label="language==0?'国家/地区协会名':'MNA/Team Name'" :required="form.applicatType!=2"
50 prop="associationCode">
50 <el-select v-model="form.associationCode" filterable> 51 <el-select v-model="form.associationCode" filterable>
51 <el-option v-for="item in mnaList" :key="item.code" :label="language==0?item.nameCn:item.nameEn" 52 <el-option v-for="item in mnaList" :key="item.code" :label="language==0?item.nameCn:item.nameEn"
52 :value="item.code"/> 53 :value="item.code"/>
53 </el-select> 54 </el-select>
54 </el-form-item> 55 </el-form-item>
55 <el-form-item :label="language==0?'国家/地区协会地址':'MNA/Team Address'" :required="form.applicatType!=2" prop="associationAddress"> 56 <el-form-item :label="language==0?'国家/地区协会地址':'MNA/Team Address'" :required="form.applicatType!=2"
57 prop="associationAddress">
56 <el-input v-model="form.associationAddress"/> 58 <el-input v-model="form.associationAddress"/>
57 </el-form-item> 59 </el-form-item>
58 <el-form-item :label="language==0?'邮箱':'Email'" required prop="email"> 60 <el-form-item :label="language==0?'邮箱':'Email'" required prop="email">
...@@ -80,101 +82,105 @@ ...@@ -80,101 +82,105 @@
80 <el-input v-model="form.embassyEmail"/> 82 <el-input v-model="form.embassyEmail"/>
81 </el-form-item> 83 </el-form-item>
82 84
83 <!--上传护照,多张--> 85 <!--上传护照,多张-->
84 <div class="cptVisaInfoBosTable"> 86 <div class="cptVisaInfoBosTable">
85 <el-form-item :label="language==0?'有效证件':'Passport Copy'" required> 87 <el-form-item :label="language==0?'有效证件':'Passport Copy'" required>
86 <ImageUpload v-model="form.passportCopy" :is-show-tip="false" 88 <ImageUpload v-model="form.passportCopy" :is-show-tip="false"
87 :action="'/league/visa/getPersonInfoFromCert/3'" 89 :action="'/league/visa/getPersonInfoFromCert/3'"
88 paramName="pic" 90 paramName="pic" list-type="text" :show-file-list="false"
89 :button-text="language==0?'上传':'Upload'" @response="getPassportInfo" 91 :button-text="language==0?'上传':'Upload'" @response="getPassportInfo"
90 /> 92 />
91 </el-form-item> 93 </el-form-item>
92 <!--识别信息--> 94 <!--识别信息-->
93 <div v-if="form.cptVisaInfoBos?.length>0" class="border"> 95 <div v-if="form.cptVisaInfoBos?.length>0" class="border">
94 <el-table :data="form.cptVisaInfoBos" border size="small"> 96 <el-table :data="form.cptVisaInfoBos" border size="small">
95 <el-table-column prop="position" :label="'position'" min-width="100"> 97 <el-table-column prop="passportCopy" :label="language==0?'护照':'Passport Copy'" min-width="100">
96 <template #default="scope"> 98 <template #default="scope">
97 <el-input v-model="scope.row.position" size="small"/> 99 <el-image style="width: 60px"
98 </template> 100 :src="fillImgUrl(scope.row.passportCopy)"/>
99 </el-table-column> 101 </template>
100 <el-table-column prop="lastName" :label="'lastName'" min-width="100"> 102 </el-table-column>
101 <template #default="scope"> 103 <el-table-column prop="position" :label="'position'" min-width="100">
102 <el-input v-model="scope.row.lastName" size="small"/> 104 <template #default="scope">
103 </template> 105 <el-input v-model="scope.row.position" size="small"/>
104 </el-table-column> 106 </template>
105 <el-table-column prop="fristName" :label="'firstName'" min-width="100"> 107 </el-table-column>
106 <template #default="scope"> 108 <el-table-column prop="lastName" :label="'lastName'" min-width="100">
107 <el-input v-model="scope.row.fristName" size="small"/> 109 <template #default="scope">
108 </template> 110 <el-input v-model="scope.row.lastName" size="small"/>
109 </el-table-column> 111 </template>
110 <el-table-column prop="sex" :label="language==0?'性别':'Gender'" width="100"> 112 </el-table-column>
111 <template #default="scope"> 113 <el-table-column prop="fristName" :label="'firstName'" min-width="100">
112 <el-select v-model="scope.row.sex" size="small"> 114 <template #default="scope">
113 <el-option label="male" value="0"/> 115 <el-input v-model="scope.row.fristName" size="small"/>
114 <el-option label="female" value="1"/> 116 </template>
115 </el-select> 117 </el-table-column>
116 </template> 118 <el-table-column prop="sex" :label="language==0?'性别':'Gender'" width="100">
117 </el-table-column> 119 <template #default="scope">
118 <el-table-column prop="nationality" :label="language==0?'国籍':'Nationality'" width="110px"> 120 <el-select v-model="scope.row.sex" size="small">
119 <template #default="scope"> 121 <el-option label="male" value="0"/>
120 <el-select v-model="scope.row.nationality" size="small" filterable> 122 <el-option label="female" value="1"/>
121 <el-option v-for="item in countrys" :key="item.id" :label="language==0?item.name:item.enName" 123 </el-select>
122 :value="item.id"/> 124 </template>
123 </el-select> 125 </el-table-column>
124 </template> 126 <el-table-column prop="nationality" :label="language==0?'国籍':'Nationality'" width="110px">
125 </el-table-column> 127 <template #default="scope">
126 <el-table-column prop="birth" :label="language==0?'出生日期':'Birth'" width="130px"> 128 <el-select v-model="scope.row.nationality" size="small" filterable>
127 <template #default="scope"> 129 <el-option v-for="item in countrys" :key="item.id" :label="language==0?item.name:item.enName"
128 <el-date-picker size="small" 130 :value="item.id"/>
129 v-model="scope.row.birthday" 131 </el-select>
130 style="width: 100%;" placeholder="YYYY-MM-DD" 132 </template>
131 type="date" format="YYYY-MM-DD" value-format="YYYY-MM-DD" 133 </el-table-column>
132 /> 134 <el-table-column prop="birth" :label="language==0?'出生日期':'Birth'" width="130px">
133 </template> 135 <template #default="scope">
134 </el-table-column> 136 <el-date-picker size="small"
135 <el-table-column prop="passportNo" :label="language==0?'护照号':'Passport No.'" width="110px"> 137 v-model="scope.row.birthday"
136 <template #default="scope"> 138 style="width: 100%;" placeholder="YYYY-MM-DD"
137 <el-input v-model="scope.row.passportNo" size="small"/> 139 type="date" format="YYYY-MM-DD" value-format="YYYY-MM-DD"
138 </template> 140 />
139 </el-table-column> 141 </template>
140 <el-table-column prop="expiryDate" :label="language==0?'护照签发日':'Expiry Date'" width="130px"> 142 </el-table-column>
141 <template #default="scope"> 143 <el-table-column prop="passportNo" :label="language==0?'护照号':'Passport No.'" width="110px">
142 <el-date-picker 144 <template #default="scope">
143 v-model="scope.row.issueDate" size="small" 145 <el-input v-model="scope.row.passportNo" size="small"/>
144 style="width: 100%;" placeholder="YYYY-MM-DD" 146 </template>
145 type="date" format="YYYY-MM-DD" value-format="YYYY-MM-DD" 147 </el-table-column>
146 /> 148 <el-table-column prop="expiryDate" :label="language==0?'护照签发日':'Expiry Date'" width="130px">
147 </template> 149 <template #default="scope">
148 </el-table-column> 150 <el-date-picker
149 <el-table-column prop="arrival" :label="language==0?'护照过期日':'Expiration date'" width="130px"> 151 v-model="scope.row.issueDate" size="small"
150 <template #default="scope"> 152 style="width: 100%;" placeholder="YYYY-MM-DD"
151 <el-date-picker 153 type="date" format="YYYY-MM-DD" value-format="YYYY-MM-DD"
152 v-model="scope.row.expiryDate" size="small" 154 />
153 style="width: 100%;" placeholder="YYYY-MM-DD" 155 </template>
154 type="date" format="YYYY-MM-DD" value-format="YYYY-MM-DD" 156 </el-table-column>
155 /> 157 <el-table-column prop="arrival" :label="language==0?'护照过期日':'Expiration date'" width="130px">
156 </template> 158 <template #default="scope">
157 </el-table-column> 159 <el-date-picker
158 <el-table-column label="Actions"> 160 v-model="scope.row.expiryDate" size="small"
159 <template #default="scope"> 161 style="width: 100%;" placeholder="YYYY-MM-DD"
160 <el-button type="danger" size="small" @click="delPassportInfo(scope.row)"> 162 type="date" format="YYYY-MM-DD" value-format="YYYY-MM-DD"
161 {{ language == 0 ? '删除' : 'Delete' }} 163 />
162 </el-button> 164 </template>
163 </template> 165 </el-table-column>
164 </el-table-column> 166 <el-table-column label="Actions">
165 </el-table> 167 <template #default="scope">
168 <el-button type="danger" size="small" @click="delPassportInfo(scope.row)">
169 {{ language == 0 ? '删除' : 'Delete' }}
170 </el-button>
171 </template>
172 </el-table-column>
173 </el-table>
174 </div>
166 175
167 </div> 176 </div>
168 177 <!-- 补充材料-->
169 </div>
170 <!-- 补充材料-->
171 <el-form-item :label="language==0?'补充材料':'Additional Documents'" prop="files"> 178 <el-form-item :label="language==0?'补充材料':'Additional Documents'" prop="files">
172 <file-upload v-model="form.files" :limit="1" :is-show-tip="false" 179 <file-upload v-model="form.files" :limit="1" :is-show-tip="false"
173 :button-text="language==0?'上传':'Upload'"/> 180 :button-text="language==0?'上传':'Upload'"/>
174 </el-form-item> 181 </el-form-item>
175 182
176 183
177
178 <div class="text-center"> 184 <div class="text-center">
179 <el-button type="primary" size="large" @click="submit" round class="btn-lineG"> 185 <el-button type="primary" size="large" @click="submit" round class="btn-lineG">
180 {{ language == 0 ? '提交' : 'SUBMIT' }} 186 {{ language == 0 ? '提交' : 'SUBMIT' }}
...@@ -194,12 +200,15 @@ import {ElMessage, ElMessageBox} from "element-plus"; ...@@ -194,12 +200,15 @@ import {ElMessage, ElMessageBox} from "element-plus";
194 import {addInvitation, associationList, countryList, getVisaInfo} from "@/apiPc/match"; 200 import {addInvitation, associationList, countryList, getVisaInfo} from "@/apiPc/match";
195 import ImageUpload from '@/components/ImageUpload/index.vue' 201 import ImageUpload from '@/components/ImageUpload/index.vue'
196 import useUserStore from "@/store/modules/user"; 202 import useUserStore from "@/store/modules/user";
203 import _ from 'lodash'
204 import FileUpload from "@/components/FileUpload";
205
197 const user = useUserStore().user 206 const user = useUserStore().user
198 const {proxy} = getCurrentInstance() 207 const {proxy} = getCurrentInstance()
199 const language = useStorage('language', 0) 208 const language = useStorage('language', 0)
200 const form = ref({ 209 const form = ref({
201 gender:'0', 210 gender: '0',
202 cptVisaInfoBos:[] 211 cptVisaInfoBos: []
203 }) 212 })
204 const show = ref(false) 213 const show = ref(false)
205 const showR = ref(false) 214 const showR = ref(false)
...@@ -219,7 +228,6 @@ const rules = ref( ...@@ -219,7 +228,6 @@ const rules = ref(
219 departure: [{required: true, trigger: 'change', message: language.value == 0 ? '请选择' : 'Please choose'},], 228 departure: [{required: true, trigger: 'change', message: language.value == 0 ? '请选择' : 'Please choose'},],
220 }) 229 })
221 const open = (params) => { 230 const open = (params) => {
222 console.log(params)
223 show.value = true 231 show.value = true
224 title.value = params.title 232 title.value = params.title
225 cptId.value = params.cptId 233 cptId.value = params.cptId
...@@ -235,9 +243,8 @@ function getVisa() { ...@@ -235,9 +243,8 @@ function getVisa() {
235 getVisaInfo({ 243 getVisaInfo({
236 userId: user.userId, 244 userId: user.userId,
237 cptId: cptId.value 245 cptId: cptId.value
238 }).then(res=>{ 246 }).then(res => {
239 console.log(res) 247 if (res.data && res.data.status != 2) {
240 if(res.data && res.data.status!=2){
241 showR.value = true 248 showR.value = true
242 form.value = res.data 249 form.value = res.data
243 } else { 250 } else {
...@@ -245,19 +252,22 @@ function getVisa() { ...@@ -245,19 +252,22 @@ function getVisa() {
245 } 252 }
246 }) 253 })
247 } 254 }
255
248 function getCountryList() { 256 function getCountryList() {
249 countryList().then(res => { 257 countryList().then(res => {
250 countrys.value = res.data 258 countrys.value = res.data
251 }) 259 })
252 } 260 }
261
253 function getMNAList() { 262 function getMNAList() {
254 associationList().then(res=>{ 263 associationList().then(res => {
255 mnaList.value = res.data 264 mnaList.value = res.data
256 }) 265 })
257 } 266 }
267
258 const submit = () => { 268 const submit = () => {
259 console.log(form.value) 269 console.log(form.value)
260 if (form.value.email.indexOf('@') == -1) { 270 if (form.value.email?.indexOf('@') == -1) {
261 if (language.value == 0) { 271 if (language.value == 0) {
262 ElMessage.warning('请填写正确的邮箱') 272 ElMessage.warning('请填写正确的邮箱')
263 } else { 273 } else {
...@@ -265,9 +275,6 @@ const submit = () => { ...@@ -265,9 +275,6 @@ const submit = () => {
265 } 275 }
266 return 276 return
267 } 277 }
268 // if (Array.isArray(form.value.passportCopy)) {
269 // form.value.passportCopy = form.value.passportCopy[0].url
270 // }
271 if (form.value.files && Array.isArray(form.value.files)) { 278 if (form.value.files && Array.isArray(form.value.files)) {
272 form.value.files = form.value.files[0]?.url 279 form.value.files = form.value.files[0]?.url
273 } 280 }
...@@ -282,7 +289,7 @@ const submit = () => { ...@@ -282,7 +289,7 @@ const submit = () => {
282 }).then(() => { 289 }).then(() => {
283 form.value.cptId = cptId.value 290 form.value.cptId = cptId.value
284 addInvitation(form.value).then((res) => { 291 addInvitation(form.value).then((res) => {
285 ElMessage.success(language.value == 0 ?'提交成功':'Successfully!') 292 ElMessage.success(language.value == 0 ? '提交成功' : 'Successfully!')
286 showR.value = true 293 showR.value = true
287 }) 294 })
288 }) 295 })
...@@ -291,39 +298,58 @@ const submit = () => { ...@@ -291,39 +298,58 @@ const submit = () => {
291 } 298 }
292 299
293 const getPassportInfo = (res) => { 300 const getPassportInfo = (res) => {
294 console.log(res.data) 301 if (res.data) {
295 if(res.data){
296 var obj = { 302 var obj = {
297 position:'', 303 position: '',
298 lastName:'', 304 lastName: '',
299 fristName:res.data.name, 305 fristName: res.data.name,
300 sex:res.data.sex, 306 sex: res.data.sex,
301 birthday:res.data.birth?.slice(0,10), 307 birthday: res.data.birth?.slice(0, 10),
302 nationality:'', 308 nationality: '',
303 passportNo:res.data.code, 309 passportNo: res.data.code,
304 issueDate:'', 310 issueDate: '',
305 expiryDate:'', 311 expiryDate: '',
312 passportCopy: res.data.pic
306 } 313 }
307 form.value.cptVisaInfoBos.push(obj) 314 form.value.cptVisaInfoBos.push(obj)
308 } else { 315 } else {
309 ElMessage.error(res.msg) 316 ElMessage.error(res.msg)
310 } 317 }
311 } 318 }
312 function delPassportInfo(row) {
313 319
320 function delPassportInfo(row) {
321 console.log(row,form.value.cptVisaInfoBos)
322 form.value.cptVisaInfoBos = _.remove(form.value.cptVisaInfoBos, row)
314 } 323 }
315 324
316 </script> 325 </script>
317 326
318 <style scoped lang="scss"> 327 <style scoped lang="scss">
319 .tip{font-size: 12px;} 328 :deep(.el-upload--picture-card) {
329 --el-upload-picture-card-size: 60px;
330 }
331
332 .tip {
333 font-size: 12px;
334 }
335
320 .boxInvitation { 336 .boxInvitation {
321 width: 96%; 337 width: 96%;
322 margin:20px auto 0; 338 margin: 20px auto 0;
323 } 339 }
324 h4{font-size: 15px;line-height: 1.6;} 340
325 .cptVisaInfoBosTable{padding: 15px;margin-bottom: 20px; 341 h4 {
342 font-size: 15px;
343 line-height: 1.6;
344 }
345
346 .cptVisaInfoBosTable {
347 padding: 15px;
348 margin-bottom: 20px;
326 border: 1px dashed #ebeef5; 349 border: 1px dashed #ebeef5;
327 :deep(.el-table .el-table__header-wrapper th){font-size: 12px;} 350
351 :deep(.el-table .el-table__header-wrapper th) {
352 font-size: 12px;
353 }
328 } 354 }
329 </style> 355 </style>
......
Styling with Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!