c60c7a3c by 杨炀

Merge commit '421304e8' into dev

2 parents 6c5989a6 421304e8
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
......
...@@ -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>
......
1
2 export const languageFormat = (language = 0, zh, en) => {
3 return language == 1 ? en : zh;
4 };
Styling with Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!