Merge commit '421304e8' into dev
Showing
8 changed files
with
330 additions
and
96 deletions
| 1 | <script setup> | 1 | <script setup> |
| 2 | import { ElMessage } from "element-plus"; | 2 | import { ElMessage } from "element-plus"; |
| 3 | import { addViewPeople } from "./api/index.js"; | 3 | import { addViewPeople } from "./api/index.js"; |
| 4 | import { languageFormat } from "./utils/language.js"; | ||
| 5 | import { useStorage } from "@vueuse/core/index"; | ||
| 6 | const language = useStorage("language", 0); | ||
| 4 | 7 | ||
| 5 | const router = useRouter(); | 8 | const router = useRouter(); |
| 6 | 9 | ||
| ... | @@ -9,21 +12,30 @@ const people = reactive({ | ... | @@ -9,21 +12,30 @@ const people = reactive({ |
| 9 | name: "", | 12 | name: "", |
| 10 | idCard: "", | 13 | idCard: "", |
| 11 | }, | 14 | }, |
| 12 | type: "身份证", | 15 | type: language.value == 0 ? "身份证" : "Identity Card", |
| 13 | onConfirm() { | 16 | onConfirm() { |
| 14 | if (!people.form.name) | 17 | if (!people.form.name) |
| 15 | return ElMessage({ type: "warning", message: "请输入姓名" }); | 18 | return ElMessage({ |
| 19 | type: "warning", | ||
| 20 | message: languageFormat(language.value, "请输入姓名", "Name"), | ||
| 21 | }); | ||
| 16 | if (!people.form.idCard) | 22 | if (!people.form.idCard) |
| 17 | return ElMessage({ type: "warning", message: "请输入证件号" }); | 23 | return ElMessage({ |
| 24 | type: "warning", | ||
| 25 | message: languageFormat(language.value, "请输入证件号", "ID Numbe"), | ||
| 26 | }); | ||
| 18 | 27 | ||
| 19 | // 使用正则验证身份证号码格式 | 28 | // 使用正则验证身份证号码格式 |
| 20 | const idCardRegex = | 29 | const idCardRegex = |
| 21 | /^[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]$/; | 30 | /^[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]$/; |
| 22 | if (!idCardRegex.test(people.form.idCard)) | 31 | if (!idCardRegex.test(people.form.idCard) && language.value == 0) |
| 23 | return ElMessage({ type: "warning", message: "身份证号格式不正确" }); | 32 | return ElMessage({ type: "warning", message: "身份证号格式不正确" }); |
| 24 | 33 | ||
| 25 | addViewPeople(people.form).then((res) => { | 34 | addViewPeople(people.form).then((res) => { |
| 26 | ElMessage({ type: "success", message: "操作成功" }); | 35 | ElMessage({ |
| 36 | type: "success", | ||
| 37 | message: languageFormat(language.value, "操作成功", "Operate successfully"), | ||
| 38 | }); | ||
| 27 | router.go(-2); | 39 | router.go(-2); |
| 28 | }); | 40 | }); |
| 29 | }, | 41 | }, |
| ... | @@ -32,19 +44,25 @@ const people = reactive({ | ... | @@ -32,19 +44,25 @@ const people = reactive({ |
| 32 | 44 | ||
| 33 | <template> | 45 | <template> |
| 34 | <div class="container"> | 46 | <div class="container"> |
| 35 | <div class="title">新增观影人</div> | 47 | <div class="title"> |
| 48 | {{ languageFormat(language, "新增观影人", "Companion") }} | ||
| 49 | </div> | ||
| 36 | <div class="content"> | 50 | <div class="content"> |
| 37 | <div class="form-item"> | 51 | <div class="form-item"> |
| 38 | <div> | 52 | <div> |
| 39 | <div class="label">姓名</div> | 53 | <div class="label"> |
| 54 | {{ languageFormat(language, "姓名", "Full Name") }} | ||
| 55 | </div> | ||
| 40 | <el-input | 56 | <el-input |
| 41 | v-model="people.form.name" | 57 | v-model="people.form.name" |
| 42 | style="width: 570px" | 58 | style="width: 570px" |
| 43 | placeholder="请输入姓名" | 59 | :placeholder="language == 0 ? '请输入姓名' : 'Nama'" |
| 44 | /> | 60 | /> |
| 45 | </div> | 61 | </div> |
| 46 | <div> | 62 | <div> |
| 47 | <div class="label">证件类型</div> | 63 | <div class="label"> |
| 64 | {{ languageFormat(language, "证件类型", "Type of Document") }} | ||
| 65 | </div> | ||
| 48 | <el-input | 66 | <el-input |
| 49 | v-model="people.type" | 67 | v-model="people.type" |
| 50 | style="width: 570px" | 68 | style="width: 570px" |
| ... | @@ -55,19 +73,25 @@ const people = reactive({ | ... | @@ -55,19 +73,25 @@ const people = reactive({ |
| 55 | </div> | 73 | </div> |
| 56 | <div class="form-item"> | 74 | <div class="form-item"> |
| 57 | <div> | 75 | <div> |
| 58 | <div class="label">身份证号</div> | 76 | <div class="label"> |
| 77 | {{ languageFormat(language, "身份证号", "Identity Card") }} | ||
| 78 | </div> | ||
| 59 | <el-input | 79 | <el-input |
| 60 | v-model="people.form.idCard" | 80 | v-model="people.form.idCard" |
| 61 | style="width: 570px" | 81 | style="width: 570px" |
| 62 | placeholder="请输入身份证号" | 82 | :placeholder="language == 0 ? '请输入身份证号' : 'ID Numbe'" |
| 63 | /> | 83 | /> |
| 64 | </div> | 84 | </div> |
| 65 | </div> | 85 | </div> |
| 66 | </div> | 86 | </div> |
| 67 | 87 | ||
| 68 | <div class="footer"> | 88 | <div class="footer"> |
| 69 | <div class="can_pay">取消</div> | 89 | <div class="can_pay"> |
| 70 | <div class="pay" @click="people.onConfirm()">确认</div> | 90 | {{ languageFormat(language, "取消", "Cancel") }} |
| 91 | </div> | ||
| 92 | <div class="pay" @click="people.onConfirm()"> | ||
| 93 | {{ languageFormat(language, "确认", "Confirm") }} | ||
| 94 | </div> | ||
| 71 | </div> | 95 | </div> |
| 72 | </div> | 96 | </div> |
| 73 | </template> | 97 | </template> | ... | ... |
| ... | @@ -4,7 +4,9 @@ import { ElMessage } from "element-plus"; | ... | @@ -4,7 +4,9 @@ import { ElMessage } from "element-plus"; |
| 4 | import { payOrder, viewPeopleList, checkPaySuccess } from "./api/index.js"; | 4 | import { payOrder, viewPeopleList, checkPaySuccess } from "./api/index.js"; |
| 5 | import qrCodeDialog from "./components/qrCodeDialog.vue"; | 5 | import qrCodeDialog from "./components/qrCodeDialog.vue"; |
| 6 | import qrcode from "qrcode"; | 6 | import qrcode from "qrcode"; |
| 7 | import { onUnmounted } from "vue"; | 7 | import { languageFormat } from "./utils/language.js"; |
| 8 | import { useStorage } from "@vueuse/core/index"; | ||
| 9 | const language = useStorage("language", 0); | ||
| 8 | 10 | ||
| 9 | const route = useRoute(); | 11 | const route = useRoute(); |
| 10 | const router = useRouter(); | 12 | const router = useRouter(); |
| ... | @@ -22,7 +24,14 @@ const startCheckSuccessListener = (orderSn, actId) => { | ... | @@ -22,7 +24,14 @@ const startCheckSuccessListener = (orderSn, actId) => { |
| 22 | timer = null; | 24 | timer = null; |
| 23 | // 支付成功 | 25 | // 支付成功 |
| 24 | payment.showCodeDialog = false; | 26 | payment.showCodeDialog = false; |
| 25 | ElMessage({ type: "success", message: "支付成功" }); | 27 | ElMessage({ |
| 28 | type: "success", | ||
| 29 | message: anguageFormat( | ||
| 30 | language.value, | ||
| 31 | "支付成功", | ||
| 32 | "Payment succeeded" | ||
| 33 | ), | ||
| 34 | }); | ||
| 26 | router.replace({ | 35 | router.replace({ |
| 27 | path: "/seat/order", | 36 | path: "/seat/order", |
| 28 | }); | 37 | }); |
| ... | @@ -44,9 +53,23 @@ const payment = reactive({ | ... | @@ -44,9 +53,23 @@ const payment = reactive({ |
| 44 | qrCodeData: "", | 53 | qrCodeData: "", |
| 45 | paymentHandle() { | 54 | paymentHandle() { |
| 46 | if (payment.form.viewers.length != order.data?.seatInfo?.length) | 55 | if (payment.form.viewers.length != order.data?.seatInfo?.length) |
| 47 | return ElMessage({ type: "warning", message: "观看人与购买票数不符" }); | 56 | return ElMessage({ |
| 57 | type: "warning", | ||
| 58 | message: languageFormat( | ||
| 59 | language.value, | ||
| 60 | "观看人与购买票数不符", | ||
| 61 | "The number of viewers does not match the number of tickets purchased." | ||
| 62 | ), | ||
| 63 | }); | ||
| 48 | if (!payment.form.phone) | 64 | if (!payment.form.phone) |
| 49 | return ElMessage({ type: "warning", message: "请输入联系人电话" }); | 65 | return ElMessage({ |
| 66 | type: "warning", | ||
| 67 | message: languageFormat( | ||
| 68 | language.value, | ||
| 69 | "请输入联系电话", | ||
| 70 | "Please enter the contact phone number." | ||
| 71 | ), | ||
| 72 | }); | ||
| 50 | payOrder({ | 73 | payOrder({ |
| 51 | contactPhone: payment.form.phone, | 74 | contactPhone: payment.form.phone, |
| 52 | customerIds: payment.form.viewers, | 75 | customerIds: payment.form.viewers, |
| ... | @@ -54,14 +77,18 @@ const payment = reactive({ | ... | @@ -54,14 +77,18 @@ const payment = reactive({ |
| 54 | payType: 1, | 77 | payType: 1, |
| 55 | paymentAmount: order.data?.paymentAmount, | 78 | paymentAmount: order.data?.paymentAmount, |
| 56 | }).then((res) => { | 79 | }).then((res) => { |
| 57 | payment.qrInfo = res.data; | 80 | if (res.data.language == "zh-cn") { |
| 58 | qrcode.toDataURL(res.data.scanCodeUrl, (err, url) => { | 81 | payment.qrInfo = res.data; |
| 59 | if (url) { | 82 | qrcode.toDataURL(res.data.scanCodeUrl, (err, url) => { |
| 60 | payment.qrCodeData = url; | 83 | if (url) { |
| 61 | } | 84 | payment.qrCodeData = url; |
| 62 | }); | 85 | } |
| 63 | payment.showCodeDialog = true; | 86 | }); |
| 64 | startCheckSuccessListener(res.data.orderSn, props.activityId); | 87 | payment.showCodeDialog = true; |
| 88 | startCheckSuccessListener(res.data.orderSn, props.activityId); | ||
| 89 | } else { | ||
| 90 | // TODO: 这里是PayPal支付 | ||
| 91 | } | ||
| 65 | }); | 92 | }); |
| 66 | }, | 93 | }, |
| 67 | handleCloce() { | 94 | handleCloce() { |
| ... | @@ -98,8 +125,8 @@ const audience = reactive({ | ... | @@ -98,8 +125,8 @@ const audience = reactive({ |
| 98 | }); | 125 | }); |
| 99 | 126 | ||
| 100 | onUnmounted(() => { | 127 | onUnmounted(() => { |
| 101 | clearInterval(timer) | 128 | clearInterval(timer); |
| 102 | }) | 129 | }); |
| 103 | 130 | ||
| 104 | audience.fetchData(); | 131 | audience.fetchData(); |
| 105 | order.fetchData(); | 132 | order.fetchData(); |
| ... | @@ -107,7 +134,9 @@ order.fetchData(); | ... | @@ -107,7 +134,9 @@ order.fetchData(); |
| 107 | 134 | ||
| 108 | <template> | 135 | <template> |
| 109 | <div class="container"> | 136 | <div class="container"> |
| 110 | <div class="title">订单确认</div> | 137 | <div class="title"> |
| 138 | {{ languageFormat(language, "订单确认", "Order confirmation") }} | ||
| 139 | </div> | ||
| 111 | <div class="content"> | 140 | <div class="content"> |
| 112 | <div class="left"> | 141 | <div class="left"> |
| 113 | <div class="info"> | 142 | <div class="info"> |
| ... | @@ -118,19 +147,25 @@ order.fetchData(); | ... | @@ -118,19 +147,25 @@ order.fetchData(); |
| 118 | <div class="ticket_info"> | 147 | <div class="ticket_info"> |
| 119 | <div class="tit_box"> | 148 | <div class="tit_box"> |
| 120 | <div class="line"></div> | 149 | <div class="line"></div> |
| 121 | <div class="txt">订票信息</div> | 150 | <div class="txt"> |
| 151 | {{ languageFormat(language, "订票信息", "Ticket Info") }} | ||
| 152 | </div> | ||
| 122 | </div> | 153 | </div> |
| 123 | 154 | ||
| 124 | <div class="form"> | 155 | <div class="form"> |
| 125 | <el-form> | 156 | <el-form> |
| 126 | <el-form-item label="联系人"> | 157 | <el-form-item :label="language == 0 ? '联系人' : 'contacts'"> |
| 127 | <el-input | 158 | <el-input |
| 128 | v-model="payment.form.phone" | 159 | v-model="payment.form.phone" |
| 129 | placeholder="请输入联系人电话" | 160 | :placeholder=" |
| 161 | language == 0 | ||
| 162 | ? '请输入联系电话' | ||
| 163 | : 'Please enter the contact phone number' | ||
| 164 | " | ||
| 130 | style="width: 260px" | 165 | style="width: 260px" |
| 131 | /> | 166 | /> |
| 132 | </el-form-item> | 167 | </el-form-item> |
| 133 | <el-form-item label="观看人"> | 168 | <el-form-item :label="language == 0 ? '观看人' : 'contacts'"> |
| 134 | <div class="p_box"> | 169 | <div class="p_box"> |
| 135 | <div class="people"> | 170 | <div class="people"> |
| 136 | <el-checkbox-group | 171 | <el-checkbox-group |
| ... | @@ -155,7 +190,7 @@ order.fetchData(); | ... | @@ -155,7 +190,7 @@ order.fetchData(); |
| 155 | class="btn" | 190 | class="btn" |
| 156 | @click="$router.push({ path: '/seat/people_manage' })" | 191 | @click="$router.push({ path: '/seat/people_manage' })" |
| 157 | > | 192 | > |
| 158 | 新增 | 193 | {{ languageFormat(language, "新增", "Add") }} |
| 159 | </div> | 194 | </div> |
| 160 | </div> | 195 | </div> |
| 161 | </el-form-item> | 196 | </el-form-item> |
| ... | @@ -167,16 +202,19 @@ order.fetchData(); | ... | @@ -167,16 +202,19 @@ order.fetchData(); |
| 167 | <div class="right"> | 202 | <div class="right"> |
| 168 | <div class="tit_box"> | 203 | <div class="tit_box"> |
| 169 | <div class="line"></div> | 204 | <div class="line"></div> |
| 170 | <div class="txt">订单明细</div> | 205 | <div class="txt"> |
| 206 | {{ languageFormat(language, "订单明细", "Order summary") }} | ||
| 207 | </div> | ||
| 171 | </div> | 208 | </div> |
| 172 | 209 | ||
| 173 | <div class="detail"> | 210 | <div class="detail"> |
| 174 | <div class="detail_top"> | 211 | <div class="detail_top"> |
| 175 | <div class="time">{{ order.data?.dateStr }}</div> | 212 | <div class="time">{{ order.data?.dateStr }}</div> |
| 176 | <div class="ticket"> | 213 | <div class="ticket"> |
| 177 | {{ order.data?.singlePrice }}元票档 x{{ | 214 | {{ order.data?.singlePrice }}<span v-if="language == 0">元</span |
| 215 | >{{ languageFormat(language, "票档", "Ticket file") }} x{{ | ||
| 178 | order.data?.seatInfo?.length | 216 | order.data?.seatInfo?.length |
| 179 | }}张 | 217 | }}{{ languageFormat(language, "张", "tickets") }} |
| 180 | </div> | 218 | </div> |
| 181 | </div> | 219 | </div> |
| 182 | <div class="detail_center"> | 220 | <div class="detail_center"> |
| ... | @@ -185,25 +223,35 @@ order.fetchData(); | ... | @@ -185,25 +223,35 @@ order.fetchData(); |
| 185 | :key="index" | 223 | :key="index" |
| 186 | class="ticket" | 224 | class="ticket" |
| 187 | > | 225 | > |
| 188 | <span v-if="it.venueId == 1">{{ it.area }}区</span> | 226 | <span v-if="it.venueId == 1" |
| 189 | {{ it.pai }}排{{ it.no }}座 ({{ | 227 | >{{ it.area }}{{ languageFormat(language, "区", "Zones") }} |
| 228 | </span> | ||
| 229 | {{ it.pai }}{{ languageFormat(language, "排", "Row") }} {{ it.no | ||
| 230 | }}{{ languageFormat(language, "座", "Seat") }} ({{ | ||
| 190 | it.venueId == 1 ? "B6" : "B4" | 231 | it.venueId == 1 ? "B6" : "B4" |
| 191 | }}馆) | 232 | }}{{ languageFormat(language, "馆", "Venue") }}) |
| 192 | </div> | 233 | </div> |
| 193 | </div> | 234 | </div> |
| 194 | <div class="detail_b"> | 235 | <div class="detail_b"> |
| 195 | <div class="sum_txt">共计</div> | 236 | <div class="sum_txt"> |
| 196 | <div class="price_num">¥{{ order.data?.paymentAmount }}</div> | 237 | {{ languageFormat(language, "共计", "Total") }} |
| 238 | </div> | ||
| 239 | <div class="price_num"> | ||
| 240 | <span v-if="language == 1">¥</span>{{ order.data?.paymentAmount }} | ||
| 241 | </div> | ||
| 197 | </div> | 242 | </div> |
| 198 | </div> | 243 | </div> |
| 199 | </div> | 244 | </div> |
| 200 | </div> | 245 | </div> |
| 201 | <div class="footer"> | 246 | <div class="footer"> |
| 202 | <div> | 247 | <div> |
| 203 | <span class="label">共计金额:</span | 248 | <span class="label" |
| 249 | >{{ languageFormat(language, "共计金额", "Subtotal") }}:</span | ||
| 204 | ><span class="value">¥{{ order.data?.paymentAmount }}</span> | 250 | ><span class="value">¥{{ order.data?.paymentAmount }}</span> |
| 205 | </div> | 251 | </div> |
| 206 | <div class="pay" @click="payment.paymentHandle()">立即支付</div> | 252 | <div class="pay" @click="payment.paymentHandle()"> |
| 253 | {{ languageFormat(language, "立即支付", "Pay Now") }} | ||
| 254 | </div> | ||
| 207 | </div> | 255 | </div> |
| 208 | 256 | ||
| 209 | <el-dialog | 257 | <el-dialog | ... | ... |
This diff is collapsed.
Click to expand it.
| ... | @@ -11,37 +11,46 @@ import qrCodeDialog from "./components/qrCodeDialog.vue"; | ... | @@ -11,37 +11,46 @@ import qrCodeDialog from "./components/qrCodeDialog.vue"; |
| 11 | import { ElMessageBox, ElMessage } from "element-plus"; | 11 | import { ElMessageBox, ElMessage } from "element-plus"; |
| 12 | import qrcode from "qrcode"; | 12 | import qrcode from "qrcode"; |
| 13 | import { md5 } from "md5js"; | 13 | import { md5 } from "md5js"; |
| 14 | import { languageFormat } from "./utils/language.js"; | ||
| 15 | import { useStorage } from "@vueuse/core/index"; | ||
| 16 | const language = useStorage("language", 0); | ||
| 14 | 17 | ||
| 15 | const userStore = useUserStore(); | 18 | const userStore = useUserStore(); |
| 16 | 19 | ||
| 17 | const status = reactive({ | 20 | const status = reactive({ |
| 18 | 0: { | 21 | 0: { |
| 19 | txt: "待支付", | 22 | txt: "待支付", |
| 23 | text_en: "Pending Payment", | ||
| 20 | color: "#F740A6", | 24 | color: "#F740A6", |
| 21 | bgColor: "#FFE2F2", | 25 | bgColor: "#FFE2F2", |
| 22 | }, | 26 | }, |
| 23 | 1: { | 27 | 1: { |
| 24 | txt: "购票成功", | 28 | txt: "购票成功", |
| 29 | text_en: "Transaction completed", | ||
| 25 | color: "#FFCC00", | 30 | color: "#FFCC00", |
| 26 | bgColor: "#FFF7D9", | 31 | bgColor: "#FFF7D9", |
| 27 | }, | 32 | }, |
| 28 | 2: { | 33 | 2: { |
| 29 | txt: "交易关闭", | 34 | txt: "交易关闭", |
| 35 | text_en: "Transaction closed", | ||
| 30 | color: "#757575", | 36 | color: "#757575", |
| 31 | bgColor: "#DDDDDD", | 37 | bgColor: "#DDDDDD", |
| 32 | }, | 38 | }, |
| 33 | 3: { | 39 | 3: { |
| 34 | txt: "已退款", | 40 | txt: "已退款", |
| 41 | text_en: "Already refunded", | ||
| 35 | color: "#757575", | 42 | color: "#757575", |
| 36 | bgColor: "#DDDDDD", | 43 | bgColor: "#DDDDDD", |
| 37 | }, | 44 | }, |
| 38 | 4: { | 45 | 4: { |
| 39 | txt: '退款中', | 46 | txt: "退款中", |
| 47 | text_en: "In the process of refunding", | ||
| 40 | color: "#F740A6", | 48 | color: "#F740A6", |
| 41 | bgColor: "#FFE2F2", | 49 | bgColor: "#FFE2F2", |
| 42 | }, | 50 | }, |
| 43 | 5: { | 51 | 5: { |
| 44 | txt: "完成", | 52 | txt: "完成", |
| 53 | text_en: "Finish", | ||
| 45 | color: "#34C759", | 54 | color: "#34C759", |
| 46 | bgColor: "#D2FFDD", | 55 | bgColor: "#D2FFDD", |
| 47 | }, | 56 | }, |
| ... | @@ -96,18 +105,30 @@ const order = reactive({ | ... | @@ -96,18 +105,30 @@ const order = reactive({ |
| 96 | }, | 105 | }, |
| 97 | // 取消支付 | 106 | // 取消支付 |
| 98 | cancelPayment(it) { | 107 | cancelPayment(it) { |
| 99 | ElMessageBox.confirm("确定取消支付吗?", "提示", { | 108 | ElMessageBox.confirm( |
| 100 | confirmButtonText: "确认", | 109 | languageFormat( |
| 101 | cancelButtonText: "取消", | 110 | language.value, |
| 102 | type: "warning", | 111 | "确认取消支付吗?", |
| 103 | draggable: true, | 112 | "Are you sure to cancel the payment?" |
| 104 | }) | 113 | ), |
| 114 | languageFormat(language.value, "提示", "tip"), | ||
| 115 | { | ||
| 116 | confirmButtonText: languageFormat(language.value, "确认", "confirm"), | ||
| 117 | cancelButtonText: languageFormat(language.value, "取消", "cancel"), | ||
| 118 | type: "warning", | ||
| 119 | draggable: true, | ||
| 120 | } | ||
| 121 | ) | ||
| 105 | .then(() => { | 122 | .then(() => { |
| 106 | cancelPay({ orderSn: it.orderSn }).then(() => { | 123 | cancelPay({ orderSn: it.orderSn }).then(() => { |
| 107 | order.fetchData(); | 124 | order.fetchData(); |
| 108 | ElMessage({ | 125 | ElMessage({ |
| 109 | type: "success", | 126 | type: "success", |
| 110 | message: "操作成功", | 127 | message: languageFormat( |
| 128 | language.value, | ||
| 129 | "操作成功", | ||
| 130 | "Operate successfully" | ||
| 131 | ), | ||
| 111 | }); | 132 | }); |
| 112 | }); | 133 | }); |
| 113 | }) | 134 | }) |
| ... | @@ -162,7 +183,7 @@ onUnmounted(() => { | ... | @@ -162,7 +183,7 @@ onUnmounted(() => { |
| 162 | 183 | ||
| 163 | // 用户免登录 | 184 | // 用户免登录 |
| 164 | const login = async () => { | 185 | const login = async () => { |
| 165 | const userId = userStore.user?.userId | 186 | const userId = userStore.user?.userId; |
| 166 | const sign = md5(`uid=${userId}lgo1acfkw51jfo`, 32); | 187 | const sign = md5(`uid=${userId}lgo1acfkw51jfo`, 32); |
| 167 | return loginFree({ | 188 | return loginFree({ |
| 168 | userId: userId, | 189 | userId: userId, |
| ... | @@ -173,9 +194,8 @@ const login = async () => { | ... | @@ -173,9 +194,8 @@ const login = async () => { |
| 173 | }); | 194 | }); |
| 174 | }; | 195 | }; |
| 175 | onMounted(() => { | 196 | onMounted(() => { |
| 176 | login() | 197 | login(); |
| 177 | }); | 198 | }); |
| 178 | |||
| 179 | </script> | 199 | </script> |
| 180 | 200 | ||
| 181 | <template> | 201 | <template> |
| ... | @@ -195,13 +215,35 @@ onMounted(() => { | ... | @@ -195,13 +215,35 @@ onMounted(() => { |
| 195 | <img class="cover_img" :src="it.coverImg" /> | 215 | <img class="cover_img" :src="it.coverImg" /> |
| 196 | <div class="info"> | 216 | <div class="info"> |
| 197 | <div class="title">{{ it.name }}</div> | 217 | <div class="title">{{ it.name }}</div> |
| 198 | <div class="common">时间:{{ it.dateStr }}</div> | 218 | <div class="common"> |
| 199 | <div class="common">地址:{{ it.placeName }}</div> | 219 | {{ languageFormat(language, "时间", "Event Date & Time") }}:{{ |
| 200 | <div class="common">订单编号:{{ it.orderSn }}</div> | 220 | it.dateStr |
| 201 | <div class="common">张数:{{ it.ticketNum }}张</div> | 221 | }} |
| 202 | <div class="common">金额:¥{{ it.payAmount }}</div> | 222 | </div> |
| 223 | <div class="common"> | ||
| 224 | {{ languageFormat(language, "地址", "Location") }}:{{ | ||
| 225 | it.placeName | ||
| 226 | }} | ||
| 227 | </div> | ||
| 228 | <div class="common"> | ||
| 229 | {{ languageFormat(language, "订单编号", "Order No.") }}:{{ | ||
| 230 | it.orderSn | ||
| 231 | }} | ||
| 232 | </div> | ||
| 233 | <div class="common"> | ||
| 234 | {{ languageFormat(language, "张数", "Location") }}:{{ it.ticketNum | ||
| 235 | }}{{ languageFormat(language, "张", "tickets") }} | ||
| 236 | </div> | ||
| 237 | <div class="common"> | ||
| 238 | {{ languageFormat(language, "金额", "Ticket Price") }}:<span | ||
| 239 | v-if="language == 0" | ||
| 240 | >¥</span | ||
| 241 | >{{ it.payAmount }} | ||
| 242 | </div> | ||
| 203 | <div class="status"> | 243 | <div class="status"> |
| 204 | <div class="label">订单状态:</div> | 244 | <div class="label"> |
| 245 | {{ languageFormat(language, "订单状态", "Order Status") }}: | ||
| 246 | </div> | ||
| 205 | <div class="value"> | 247 | <div class="value"> |
| 206 | <div | 248 | <div |
| 207 | :style="{ | 249 | :style="{ |
| ... | @@ -211,10 +253,19 @@ onMounted(() => { | ... | @@ -211,10 +253,19 @@ onMounted(() => { |
| 211 | }" | 253 | }" |
| 212 | class="tag" | 254 | class="tag" |
| 213 | > | 255 | > |
| 214 | {{ status[it.state].txt }} | 256 | {{ |
| 257 | language == 0 ? status[it.state].txt : status[it.state].txt_en | ||
| 258 | }} | ||
| 215 | </div> | 259 | </div> |
| 216 | <div v-if="it.state == 0" class="tip"> | 260 | <div v-if="it.state == 0" class="tip"> |
| 217 | 请尽快完成支付,还剩{{ order.minutes }}分{{ order.seconds }}秒 | 261 | <span v-if="language == 0" |
| 262 | >请尽快完成支付,还剩{{ order.minutes }}分{{ | ||
| 263 | order.seconds | ||
| 264 | }}秒</span | ||
| 265 | > | ||
| 266 | <span v-else | ||
| 267 | >Time left {{ order.minutes }}:{{ order.seconds }}</span | ||
| 268 | > | ||
| 218 | </div> | 269 | </div> |
| 219 | </div> | 270 | </div> |
| 220 | </div> | 271 | </div> | ... | ... |
| 1 | <script setup> | 1 | <script setup> |
| 2 | import { deleteViewPeople, viewPeopleList } from "./api/index.js"; | 2 | import { deleteViewPeople, viewPeopleList } from "./api/index.js"; |
| 3 | import { ElMessageBox, ElMessage } from "element-plus"; | 3 | import { ElMessageBox, ElMessage } from "element-plus"; |
| 4 | 4 | import { languageFormat } from "./utils/language.js"; | |
| 5 | import { useStorage } from "@vueuse/core/index"; | ||
| 6 | const language = useStorage("language", 0); | ||
| 5 | 7 | ||
| 6 | const audience = reactive({ | 8 | const audience = reactive({ |
| 7 | data: [], | 9 | data: [], |
| ... | @@ -12,18 +14,30 @@ const audience = reactive({ | ... | @@ -12,18 +14,30 @@ const audience = reactive({ |
| 12 | }, | 14 | }, |
| 13 | 15 | ||
| 14 | deletePeople(id) { | 16 | deletePeople(id) { |
| 15 | ElMessageBox.confirm("确定删除该观看人吗?", "提示", { | 17 | ElMessageBox.confirm( |
| 16 | confirmButtonText: "确认", | 18 | languageFormat( |
| 17 | cancelButtonText: "取消", | 19 | language.value, |
| 18 | type: "warning", | 20 | "确认删除该观看人吗?", |
| 19 | draggable: true, | 21 | "Are you sure to delete this viewer?" |
| 20 | }) | 22 | ), |
| 23 | languageFormat(language.value, "提示", "Reminder"), | ||
| 24 | { | ||
| 25 | confirmButtonText: languageFormat(language.value, "确认", "confirm"), | ||
| 26 | cancelButtonText: languageFormat(language.value, "取消", "cancel"), | ||
| 27 | type: "warning", | ||
| 28 | draggable: true, | ||
| 29 | } | ||
| 30 | ) | ||
| 21 | .then(() => { | 31 | .then(() => { |
| 22 | deleteViewPeople({ id }).then(() => { | 32 | deleteViewPeople({ id }).then(() => { |
| 23 | audience.fetchData(); | 33 | audience.fetchData(); |
| 24 | ElMessage({ | 34 | ElMessage({ |
| 25 | type: "success", | 35 | type: "success", |
| 26 | message: "操作成功", | 36 | message: languageFormat( |
| 37 | language.value, | ||
| 38 | "操作成功", | ||
| 39 | "Operate successfully" | ||
| 40 | ), | ||
| 27 | }); | 41 | }); |
| 28 | }); | 42 | }); |
| 29 | }) | 43 | }) |
| ... | @@ -41,9 +55,9 @@ audience.fetchData(); | ... | @@ -41,9 +55,9 @@ audience.fetchData(); |
| 41 | class="add_btn" | 55 | class="add_btn" |
| 42 | @click="$router.push({ path: '/seat/add_watch_people' })" | 56 | @click="$router.push({ path: '/seat/add_watch_people' })" |
| 43 | > | 57 | > |
| 44 | 新增 | 58 | {{ languageFormat(language, "新增", "Add") }} |
| 45 | </div> | 59 | </div> |
| 46 | 观影人管理 | 60 | {{ languageFormat(language, "观影人管理", "Viewers") }} |
| 47 | </div> | 61 | </div> |
| 48 | <div class="content"> | 62 | <div class="content"> |
| 49 | <div class="people_box"> | 63 | <div class="people_box"> |
| ... | @@ -53,8 +67,14 @@ audience.fetchData(); | ... | @@ -53,8 +67,14 @@ audience.fetchData(); |
| 53 | class="people_item" | 67 | class="people_item" |
| 54 | > | 68 | > |
| 55 | <div class="name">{{ it.name }}</div> | 69 | <div class="name">{{ it.name }}</div> |
| 56 | <div class="idcard">身份证:{{ it.idCard }}</div> | 70 | <div class="idcard"> |
| 57 | <div class="btn" @click="audience.deletePeople(it.id)">删除</div> | 71 | {{ languageFormat(language, "身份证", "Identity Card") }}:{{ |
| 72 | it.idCard | ||
| 73 | }} | ||
| 74 | </div> | ||
| 75 | <div class="btn" @click="audience.deletePeople(it.id)"> | ||
| 76 | {{ languageFormat(language, "删除", "delete") }} | ||
| 77 | </div> | ||
| 58 | </div> | 78 | </div> |
| 59 | </div> | 79 | </div> |
| 60 | </div> | 80 | </div> | ... | ... |
| 1 | <script setup> | 1 | <script setup> |
| 2 | import { ElMessage } from "element-plus"; | 2 | import { ElMessage } from "element-plus"; |
| 3 | import { getPriceLevelInfo, getSiteConfig, confirmOrder } from "./api/index.js"; | 3 | import { getPriceLevelInfo, getSiteConfig, confirmOrder } from "./api/index.js"; |
| 4 | import { onBeforeUnmount } from "vue"; | 4 | import { languageFormat } from "./utils/language.js"; |
| 5 | import { useStorage } from "@vueuse/core/index"; | ||
| 6 | const language = useStorage("language", 0); | ||
| 5 | 7 | ||
| 6 | const route = useRoute(); | 8 | const route = useRoute(); |
| 7 | const router = useRouter(); | 9 | const router = useRouter(); |
| ... | @@ -62,6 +64,22 @@ function onWindowMessage(e) { | ... | @@ -62,6 +64,22 @@ function onWindowMessage(e) { |
| 62 | moveToPriceArea(route.query.ticket_block); | 64 | moveToPriceArea(route.query.ticket_block); |
| 63 | }, 500); | 65 | }, 500); |
| 64 | }); | 66 | }); |
| 67 | |||
| 68 | // 绘制舞台矩形 | ||
| 69 | sendMsg("draw-object-rectangle", { | ||
| 70 | x: 1800, | ||
| 71 | y: 960, | ||
| 72 | w: 4400, | ||
| 73 | h: 1300, | ||
| 74 | color: "#e0e0e0", | ||
| 75 | }); | ||
| 76 | // 绘制舞台文字 | ||
| 77 | sendMsg("draw-object-text", { | ||
| 78 | x: 3900, | ||
| 79 | y: 1500, | ||
| 80 | text: language.value == 0 ? "舞台" : "stage", | ||
| 81 | style: { fontSize: 160, fontWeight: "400", fill: "#6a6a6a" }, | ||
| 82 | }); | ||
| 65 | } else if (data.type == "seat-click") { | 83 | } else if (data.type == "seat-click") { |
| 66 | // 子页面点击了座位 | 84 | // 子页面点击了座位 |
| 67 | const seatData = data.data; | 85 | const seatData = data.data; |
| ... | @@ -78,7 +96,14 @@ function onWindowMessage(e) { | ... | @@ -78,7 +96,14 @@ function onWindowMessage(e) { |
| 78 | selectedSeats.value?.length >= 5 && | 96 | selectedSeats.value?.length >= 5 && |
| 79 | seatData.active == 0 | 97 | seatData.active == 0 |
| 80 | ) | 98 | ) |
| 81 | return ElMessage({ type: "warning", message: "最多选择5个座位" }); | 99 | return ElMessage({ |
| 100 | type: "warning", | ||
| 101 | message: languageFormat( | ||
| 102 | language.value, | ||
| 103 | "最多选择5个座位", | ||
| 104 | "Selectt at most 5 seats" | ||
| 105 | ), | ||
| 106 | }); | ||
| 82 | 107 | ||
| 83 | const newActive = seatData.active == 0 ? 1 : 0; | 108 | const newActive = seatData.active == 0 ? 1 : 0; |
| 84 | const siteConfigItem = siteConfig.data.find((it) => it.id == seatData.id); | 109 | const siteConfigItem = siteConfig.data.find((it) => it.id == seatData.id); |
| ... | @@ -204,7 +229,14 @@ const sumPrice = computed(() => { | ... | @@ -204,7 +229,14 @@ const sumPrice = computed(() => { |
| 204 | const toConfirmOrder = () => { | 229 | const toConfirmOrder = () => { |
| 205 | const seatIds = selectedSeats.value.map((it) => it.id); | 230 | const seatIds = selectedSeats.value.map((it) => it.id); |
| 206 | if (!seatIds.length) | 231 | if (!seatIds.length) |
| 207 | return ElMessage({ type: "warning", message: "请先选择座位" }); | 232 | return ElMessage({ |
| 233 | type: "warning", | ||
| 234 | message: languageFormat( | ||
| 235 | language, | ||
| 236 | "请先选择座位", | ||
| 237 | "Please select the seat first." | ||
| 238 | ), | ||
| 239 | }); | ||
| 208 | confirmOrder({ | 240 | confirmOrder({ |
| 209 | actId: props.activityId, | 241 | actId: props.activityId, |
| 210 | openType: route.query.openType, | 242 | openType: route.query.openType, |
| ... | @@ -268,7 +300,9 @@ price.fetchData(); | ... | @@ -268,7 +300,9 @@ price.fetchData(); |
| 268 | @click="price.onClickPrice(it)" | 300 | @click="price.onClickPrice(it)" |
| 269 | > | 301 | > |
| 270 | <img class="seat" :src="it.unSelectIcon" /> | 302 | <img class="seat" :src="it.unSelectIcon" /> |
| 271 | <span class="price">{{ it.price }}¥</span> | 303 | <span class="price" |
| 304 | >{{ it.price }}<span v-if="language == 0">¥</span></span | ||
| 305 | > | ||
| 272 | </div> | 306 | </div> |
| 273 | </div> | 307 | </div> |
| 274 | </div> | 308 | </div> |
| ... | @@ -278,7 +312,11 @@ price.fetchData(); | ... | @@ -278,7 +312,11 @@ price.fetchData(); |
| 278 | <!-- v-for="(it, index) in selectedSeats" --> | 312 | <!-- v-for="(it, index) in selectedSeats" --> |
| 279 | <div v-for="(it, index) in selectedSeats" class="seat_item"> | 313 | <div v-for="(it, index) in selectedSeats" class="seat_item"> |
| 280 | <img class="seat_icon" :src="it.selectIcon" /> | 314 | <img class="seat_icon" :src="it.selectIcon" /> |
| 281 | <span class="num">{{ it.area }}区 {{ it.pai }}排{{ it.no }}座</span> | 315 | <span class="num" |
| 316 | >{{ it.area }}{{ languageFormat(language, "区", "Zones") }} | ||
| 317 | {{ it.pai }}{{ languageFormat(language, "排", "Row") }} {{ it.no }} | ||
| 318 | {{ languageFormat(language, "座", "Seat") }}</span | ||
| 319 | > | ||
| 282 | <el-icon | 320 | <el-icon |
| 283 | style="cursor: pointer" | 321 | style="cursor: pointer" |
| 284 | color="#ccc" | 322 | color="#ccc" |
| ... | @@ -289,7 +327,9 @@ price.fetchData(); | ... | @@ -289,7 +327,9 @@ price.fetchData(); |
| 289 | </div> | 327 | </div> |
| 290 | <div class="pay"> | 328 | <div class="pay"> |
| 291 | <div class="sum">¥{{ sumPrice?.toFixed(2) }}</div> | 329 | <div class="sum">¥{{ sumPrice?.toFixed(2) }}</div> |
| 292 | <div class="pay_btn" @click="toConfirmOrder()">立即购买</div> | 330 | <div class="pay_btn" @click="toConfirmOrder()"> |
| 331 | {{ languageFormat(language, "立即购买", "Continue") }} | ||
| 332 | </div> | ||
| 293 | </div> | 333 | </div> |
| 294 | </div> | 334 | </div> |
| 295 | 335 | ... | ... |
| ... | @@ -11,6 +11,9 @@ import { | ... | @@ -11,6 +11,9 @@ import { |
| 11 | getSitePlaceInfo, | 11 | getSitePlaceInfo, |
| 12 | getPriceLevelInfo, | 12 | getPriceLevelInfo, |
| 13 | } from "./api/index.js"; | 13 | } from "./api/index.js"; |
| 14 | import { languageFormat } from "./utils/language.js"; | ||
| 15 | import { useStorage } from "@vueuse/core/index"; | ||
| 16 | const language = useStorage("language", 0); | ||
| 14 | 17 | ||
| 15 | const route = useRoute(); | 18 | const route = useRoute(); |
| 16 | const router = useRouter(); | 19 | const router = useRouter(); |
| ... | @@ -90,13 +93,41 @@ const select_form = reactive({ | ... | @@ -90,13 +93,41 @@ const select_form = reactive({ |
| 90 | await login(userId); | 93 | await login(userId); |
| 91 | 94 | ||
| 92 | if (!select_form.venueItem?.id) | 95 | if (!select_form.venueItem?.id) |
| 93 | return ElMessage({ type: "warning", message: "请选择时间" }); | 96 | return ElMessage({ |
| 97 | type: "warning", | ||
| 98 | message: languageFormat( | ||
| 99 | language.value, | ||
| 100 | "请选择时间", | ||
| 101 | "Please select the time" | ||
| 102 | ), | ||
| 103 | }); | ||
| 94 | if (select_form.session == -1) | 104 | if (select_form.session == -1) |
| 95 | return ElMessage({ type: "warning", message: "请选择场次" }); | 105 | return ElMessage({ |
| 106 | type: "warning", | ||
| 107 | message: languageFormat( | ||
| 108 | language.value, | ||
| 109 | "请选择场次", | ||
| 110 | "Please select the session" | ||
| 111 | ), | ||
| 112 | }); | ||
| 96 | if (!select_form.place) | 113 | if (!select_form.place) |
| 97 | return ElMessage({ type: "warning", message: "请选择场馆" }); | 114 | return ElMessage({ |
| 115 | type: "warning", | ||
| 116 | message: languageFormat( | ||
| 117 | language.value, | ||
| 118 | "请选择场馆", | ||
| 119 | "Please choose the venue" | ||
| 120 | ), | ||
| 121 | }); | ||
| 98 | if (!select_form.ticket_block) | 122 | if (!select_form.ticket_block) |
| 99 | return ElMessage({ type: "warning", message: "请选择票档" }); | 123 | return ElMessage({ |
| 124 | type: "warning", | ||
| 125 | message: languageFormat( | ||
| 126 | language.value, | ||
| 127 | "请选择票档", | ||
| 128 | "Please choose the ticket category" | ||
| 129 | ), | ||
| 130 | }); | ||
| 100 | 131 | ||
| 101 | router.push({ | 132 | router.push({ |
| 102 | path: "/seat/seat_picker", | 133 | path: "/seat/seat_picker", |
| ... | @@ -225,7 +256,7 @@ watch( | ... | @@ -225,7 +256,7 @@ watch( |
| 225 | <div class="info"> | 256 | <div class="info"> |
| 226 | <div class="title">{{ detail.data?.name }}</div> | 257 | <div class="title">{{ detail.data?.name }}</div> |
| 227 | <div class="time"> | 258 | <div class="time"> |
| 228 | 时间:{{ | 259 | {{ languageFormat(language, "时间", "Event Date & Time") }}:{{ |
| 229 | detail.data?.startTime | 260 | detail.data?.startTime |
| 230 | ? dayjs(detail.data?.startTime).format("YYYY.MM.DD ddd") | 261 | ? dayjs(detail.data?.startTime).format("YYYY.MM.DD ddd") |
| 231 | : "" | 262 | : "" |
| ... | @@ -237,10 +268,16 @@ watch( | ... | @@ -237,10 +268,16 @@ watch( |
| 237 | : "" | 268 | : "" |
| 238 | }} | 269 | }} |
| 239 | </div> | 270 | </div> |
| 240 | <div class="address">地址:{{ detail.data?.address }}</div> | 271 | <div class="address"> |
| 272 | {{ languageFormat(language, "地址", "Location") }}:{{ | ||
| 273 | detail.data?.address | ||
| 274 | }} | ||
| 275 | </div> | ||
| 241 | <!-- 时间 --> | 276 | <!-- 时间 --> |
| 242 | <div class="select_item_box"> | 277 | <div class="select_item_box"> |
| 243 | <div class="label">时间</div> | 278 | <div class="label"> |
| 279 | {{ languageFormat(language, "时间", "Event Date & Time") }} | ||
| 280 | </div> | ||
| 244 | <div class="select_item"> | 281 | <div class="select_item"> |
| 245 | <div | 282 | <div |
| 246 | v-for="(it, index) in timeVenue.data" | 283 | v-for="(it, index) in timeVenue.data" |
| ... | @@ -251,13 +288,13 @@ watch( | ... | @@ -251,13 +288,13 @@ watch( |
| 251 | @click="select_form.onClickVenue(it)" | 288 | @click="select_form.onClickVenue(it)" |
| 252 | > | 289 | > |
| 253 | {{ it.dateStr }} | 290 | {{ it.dateStr }} |
| 254 | <div v-if="it.type == 1" class="tag_t">套票</div> | 291 | <div v-if="it.type == 1" class="tag_t">{{ languageFormat(language, "套票", "Package ticket") }}</div> |
| 255 | </div> | 292 | </div> |
| 256 | </div> | 293 | </div> |
| 257 | </div> | 294 | </div> |
| 258 | <!-- 场次 --> | 295 | <!-- 场次 --> |
| 259 | <div class="select_item_box"> | 296 | <div class="select_item_box"> |
| 260 | <div class="label">场次</div> | 297 | <div class="label">{{ languageFormat(language, "场次", "Session") }}</div> |
| 261 | <div class="select_item"> | 298 | <div class="select_item"> |
| 262 | <div | 299 | <div |
| 263 | :class="[ | 300 | :class="[ |
| ... | @@ -269,7 +306,7 @@ watch( | ... | @@ -269,7 +306,7 @@ watch( |
| 269 | ]" | 306 | ]" |
| 270 | @click="select_form.onClickSession(0)" | 307 | @click="select_form.onClickSession(0)" |
| 271 | > | 308 | > |
| 272 | 日场 | 309 | {{ languageFormat(language, "日场", "Day session") }} |
| 273 | </div> | 310 | </div> |
| 274 | <div | 311 | <div |
| 275 | :class="[ | 312 | :class="[ |
| ... | @@ -281,13 +318,15 @@ watch( | ... | @@ -281,13 +318,15 @@ watch( |
| 281 | ]" | 318 | ]" |
| 282 | @click="select_form.onClickSession(1)" | 319 | @click="select_form.onClickSession(1)" |
| 283 | > | 320 | > |
| 284 | 夜场 | 321 | {{ languageFormat(language, "夜场", "Night session") }} |
| 285 | </div> | 322 | </div> |
| 286 | </div> | 323 | </div> |
| 287 | </div> | 324 | </div> |
| 288 | <!-- 场馆 --> | 325 | <!-- 场馆 --> |
| 289 | <div class="select_item_box"> | 326 | <div class="select_item_box"> |
| 290 | <div class="label">场馆</div> | 327 | <div class="label"> |
| 328 | {{ languageFormat(language, "场馆", "Venue") }} | ||
| 329 | </div> | ||
| 291 | <div class="select_item"> | 330 | <div class="select_item"> |
| 292 | <div | 331 | <div |
| 293 | v-for="(it, index) in sitePlaceInfo.data" | 332 | v-for="(it, index) in sitePlaceInfo.data" |
| ... | @@ -310,7 +349,9 @@ watch( | ... | @@ -310,7 +349,9 @@ watch( |
| 310 | v-if="price.data?.length && select_form.place" | 349 | v-if="price.data?.length && select_form.place" |
| 311 | class="select_item_box" | 350 | class="select_item_box" |
| 312 | > | 351 | > |
| 313 | <div class="label">票档</div> | 352 | <div class="label"> |
| 353 | {{ languageFormat(language, "票档", "Ticket Category") }} | ||
| 354 | </div> | ||
| 314 | <div class="select_item"> | 355 | <div class="select_item"> |
| 315 | <div | 356 | <div |
| 316 | v-for="(it, index) in price.data" | 357 | v-for="(it, index) in price.data" |
| ... | @@ -329,16 +370,22 @@ watch( | ... | @@ -329,16 +370,22 @@ watch( |
| 329 | </div> | 370 | </div> |
| 330 | </div> | 371 | </div> |
| 331 | <!-- button --> | 372 | <!-- button --> |
| 332 | <div class="btn" @click="select_form.toSelectSeat()">选座购票</div> | 373 | <div class="btn" @click="select_form.toSelectSeat()"> |
| 374 | {{ languageFormat(language, "选座购票", "Seat selection") }} | ||
| 375 | </div> | ||
| 333 | </div> | 376 | </div> |
| 334 | </div> | 377 | </div> |
| 335 | 378 | ||
| 336 | <!-- bottom --> | 379 | <!-- bottom --> |
| 337 | <div class="container bottom"> | 380 | <div class="container bottom"> |
| 338 | <div class="title">活动介绍</div> | 381 | <div class="title"> |
| 382 | {{ languageFormat(language, "活动介绍", "Event Details") }} | ||
| 383 | </div> | ||
| 339 | <div class="rich_content" v-html="detail.data?.introduceInfo"></div> | 384 | <div class="rich_content" v-html="detail.data?.introduceInfo"></div> |
| 340 | 385 | ||
| 341 | <div class="title" style="margin-top: 30px">购票须知</div> | 386 | <div class="title" style="margin-top: 30px"> |
| 387 | {{ languageFormat(language, "购票须知", "Ticketing Information") }} | ||
| 388 | </div> | ||
| 342 | <div class="rich_content" v-html="detail.data?.buyNotice"></div> | 389 | <div class="rich_content" v-html="detail.data?.buyNotice"></div> |
| 343 | </div> | 390 | </div> |
| 344 | </div> | 391 | </div> | ... | ... |
src/viewsPc/seat/utils/language.js
0 → 100644
-
Please register or sign in to post a comment