{"id":35857,"date":"2025-05-09T17:33:00","date_gmt":"2025-05-09T09:33:00","guid":{"rendered":"https:\/\/www.goglobalsafe.com\/?page_id=35857"},"modified":"2025-05-09T17:37:45","modified_gmt":"2025-05-09T09:37:45","slug":"points-mall","status":"publish","type":"page","link":"https:\/\/ggs.uat.goglobalsafe.com\/zh\/points-mall\/","title":{"rendered":"Points Mall"},"content":{"rendered":"<div data-elementor-type=\"wp-page\" data-elementor-id=\"35857\" class=\"elementor elementor-35857\">\n\t\t\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-d98e005 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"d98e005\" data-element_type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-ceeb764\" data-id=\"ceeb764\" data-element_type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-5d661b9 elementor-widget elementor-widget-shortcode\" data-id=\"5d661b9\" data-element_type=\"widget\" data-widget_type=\"shortcode.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-shortcode\"><link href=\"\/wp-content\/static\/element\/index.min.css\" rel=\"stylesheet\">\n<script src=\"https:\/\/cdn.tailwindcss.com\"><\/script>\n<script src=\"\/wp-content\/static\/js\/vue.global.js\"><\/script>\n<script src=\"\/wp-content\/static\/js\/axios.min.js\"><\/script>\n<script src=\"\/wp-content\/static\/element\/index.full.min.js\"><\/script>\n<script src=\"https:\/\/cdn.jsdelivr.net\/npm\/markdown-it@12.3.2\/dist\/markdown-it.min.js\"><\/script>\n<style>\n    \/* \u8fc7\u6e21\u6548\u679c *\/\n    @font-face {\n        font-family: 'PingFang SC-Bold';\n        src: url('\/wp-content\/static\/font\/minFont\/PINGFANG_BOLD.subset.woff2') format('woff2');\n    }\n    [v-cloak] {\n        display: none;\n    }\n\n    .no-border-table td, .no-border-table th {\n        border: none !important;\n    }\n    input[type=\"text\"] {\n        background-color: transparent !important;\n        border:1px solid transparent !important;\n        padding:0.2rem;\n        box-shadow: none !important;\n        background-color: transparent !important; \/* \u53ef\u9009\uff1a\u80cc\u666f\u900f\u660e *\/\n    }\n    .text-ellipsis {\n        display: -webkit-box;\n        -webkit-line-clamp: 2; \/* \u663e\u793a\u884c\u6570 *\/\n        -webkit-box-orient: vertical;\n        overflow: hidden;\n        text-overflow: ellipsis;\n    }\n    @font-face {\n        font-family: 'Archivo Black-Regular';\n        src: url('\/wp-content\/static\/font\/minFont\/ArchivoBlack-Regular.woff2') format('woff2');\n        font-weight: bold;\n        font-style: normal;\n    }\n    @font-face {\n        font-family: 'Alibaba Sans';\n        src: url('\/wp-content\/static\/font\/minFont\/AlibabaSans-Medium.woff2') format('woff2');\n    }\n    .sc {\n        font-family: 'PingFang SC-Bold', sans-serif;\n    }\n    .abr {\n        font-family: 'Archivo Black-Regular', sans-serif;\n    }\n    .din {\n        font-family: 'Alibaba Sans', sans-serif;\n    }\n    a {\n        color:transparent;\n    }\n    .entry-content ul, .entry-content ol{\n        padding:unset !important;\n    }\n    .elementor-kit-17077 button:hover, .elementor-kit-17077 button:focus, .elementor-kit-17077 input[type=\"button\"]:hover, .elementor-kit-17077 input[type=\"button\"]:focus, .elementor-kit-17077 input[type=\"submit\"]:hover, .elementor-kit-17077 input[type=\"submit\"]:focus, .elementor-kit-17077 .elementor-button:hover, .elementor-kit-17077 .elementor-button:focus {\n        box-shadow:unset !important;\n    }\n    .site-content {\n        background-color: #fff;\n    }\n    .ast-single-post .entry-content a, .ast-comment-content a:not(.ast-comment-edit-reply-wrap a) {\n        text-decoration:auto !important;\n    }\n<\/style>\n\n<div id=\"app\" class=\"min-h-full bg-white\" translate=\"no\" v-cloak data-no-translation=\"\" data-no-auto-translation=\"\">\n    <div v-loading=\"big_loading\">\n        <div class=\"p-8 mb-4 max-w-md\" v-cloak>\n            <div class=\"flex justify-between w-full items-end\">\n                <!-- \u5de6\u8fb9\uff1aHi + \u8868\u60c5 -->\n                <div class=\"relative flex items-end mb-3\">\n                    <span class=\"text-gray-800 sc text-[24px] select-none\">Hi\u4e36<\/span>\n                    <img src=\"\/wp-content\/static\/img\/user\/weixiao.webp\"\n                         class=\"w-13 h-auto absolute\"\n                         decoding=\"async\"\n                         style=\"top: 28px; left: -2px;\">\n                <\/div>\n                <!-- \u53f3\u8fb9\uff1a\u8054\u7cfb\u5ba2\u670d\u56fe\u7247 -->\n                <div class=\"flex flex-col items-end pr-12\">\n                    <div class=\"cursor-pointer\" @click=\"contact_support\">\n                        <img src=\"\/wp-content\/static\/img\/points\/cards\/lianxikefu.png\"\n                             class=\"w-13 h-auto\"\n                             decoding=\"async\">\n                    <\/div>\n                <\/div>\n            <\/div>\n            <!--\u540d\u5b57-->\n            <div class=\"mt-2\">\n                <span class=\"font-bold text-gray-900 abr text-[28px] select-none\">{{ user_info.name }}<\/span>\n            <\/div>\n            <!-- \u79ef\u5206\u4fe1\u606f -->\n            <div class=\"mt-6 w-[90%] p-4 rounded-2xl relative\" style=\"background-image: url('\/wp-content\/static\/img\/points\/cards\/ponit-bg.png'); background-repeat: no-repeat; background-size: cover; background-position: center;\">\n                <div class=\"p-1\" style=\"background: #FFD146;border-radius: 12px 20px 20px 0px;width:80px;height:26px\">\n                    <p class=\"text-[14px] sc font-medium text-[#2D2D2D] mb-1 select-none\" style=\"font-weight:200;\">My points<\/p>\n                <\/div>\n                <!--\u79ef\u5206\u5c55\u793a \u5de6\u53f3\u5e03\u5c40-->\n                <div class=\"flex items-center justify-between mt-3\">\n                    <div class=\"flex space-x-3 items-center\">\n                        <img src=\"\/wp-content\/static\/img\/points\/cards\/point.png\"\n                             class=\"w-6 h-auto\"\n                             decoding=\"async\"\n                             alt=\"point\">\n                        <span class=\"text-2xl sc font-bold text-[#2D2D2D] select-none\">{{ user_info.points }}<\/span>\n                    <\/div>\n                    <a @click=\"points_details\" class=\"cursor-pointer ml-2 text-sm sc text-[#2D2D2D] select-none\">View Points Details><\/a>\n                <\/div>\n                <!--\u79ef\u5206\u6309\u94ae \u5de6\u53f3\u5e03\u5c40-->\n                <div class=\"flex justify-between mt-4\">\n                    <div class=\"cursor-pointer\" @click=\"rewaeds_store\">\n                        <img src=\"\/wp-content\/static\/img\/points\/cards\/store.png\"\n                             class=\"w-[8rem] h-auto\"\n                             decoding=\"async\"\n                             alt=\"Store\">\n                    <\/div>\n                    <div class=\"cursor-pointer\" @click=\"my_wallet\">\n                        <img src=\"\/wp-content\/static\/img\/points\/cards\/wallet.png\"\n                             class=\"w-[8rem] h-auto\"\n                             decoding=\"async\"\n                             alt=\"Wallet\">\n                    <\/div>\n\n                <\/div>\n            <\/div>\n        <\/div>\n        <div class=\"px-8 mb-6\">\n            <div class=\"flex cursor-pointer select-none\">\n                <!-- \u79ef\u5206\u5546\u57ce\u6309\u94ae -->\n                <a @click=\"activeTab = 'shop'\" :class=\"{'bg-blue-500 text-white border-b-2 border-blue-500 hover:text-white': activeTab === 'shop',               'bg-white text-[#B4B4B4] hover:text-[#B4B4B4]': activeTab !== 'shop'}\" class=\"py-2 px-4 rounded-full font-medium text-sm focus:outline-none sc\">\n                    Points Store\n                <\/a>\n                <!-- \u5151\u6362\u8bb0\u5f55\u6309\u94ae -->\n                <a @click=\"activeTab = 'records'\" :class=\"{'bg-blue-500 text-white border-b-2 border-blue-500 hover:text-white': activeTab === 'records',               'bg-white text-[#B4B4B4] hover:text-[#B4B4B4]': activeTab !== 'records'}\" class=\"ml-4 py-2 px-4 rounded-full font-medium text-sm focus:outline-none sc\">\n                    Redeemed\n                <\/a>\n            <\/div>\n        <\/div>\n        <div v-show=\"activeTab === 'shop'\" class=\"p-1 flex flex-wrap items-start justify-start\" v-cloak>\n            <!--\u5361\u7247\u5faa\u73af-->\n            <div v-for=\"item in products\" :key=\"item.id\" class=\"flex-shrink-0 mx-8 mb-12 my-3 relative overflow-visible bg-white rounded-lg max-w-xs shadow-lg group\">\n                <div class=\"relative h-full\" style=\"background:linear-gradient( 135deg, #F9F4FF 0%, #E0F1FF 53%, #E1FDFF 100%)\">\n                    <img class=\"w-full h-48 object-cover\" :src=\"`${base_img_url}${item.cover_image}`\" alt=\"Product Image\">\n                    <div v-if=\"item.display_price\" class=\"absolute -top-4 -left-8 text-white text-base font-medium px-8 py-2 bg-no-repeat bg-contain bg-center\" style=\"background-image: url('\/wp-content\/static\/img\/points\/cards\/frame1.png');\">\n                        <span class=\"text-xs sc\">Worth \uffe5{{ item.display_price }}<\/span>\n                    <\/div>\n                    <!--More \u63d0\u793a\u6309\u94ae-->\n                    <div class=\"absolute bottom-1 right-1 flex items-center justify-center space-x-1 bg-white px-1 py-1 rounded-xl cursor-help\"  @mouseenter=\"hoverIndex = item.id\" @mouseleave=\"hoverIndex = null\">\n                        <span class=\"text-black text-xs sc\">More<\/span>\n                        <!-- SVG icon -->\n                        <svg t=\"1746690950770\" class=\"icon\" viewbox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" p-id=\"2934\" width=\"16\" height=\"16\"><path d=\"M1024 512C1024 229.230209 794.769796 0 512 0 229.230204 0 0 229.230209 0 512 0 794.769791 229.230204 1024 512 1024 794.769796 1024 1024 794.769791 1024 512ZM70.62069 512C70.62069 268.232939 268.232934 70.62069 512 70.62069 755.767066 70.62069 953.37931 268.232939 953.37931 512 953.37931 755.767061 755.767066 953.37931 512 953.37931 268.232934 953.37931 70.62069 755.767061 70.62069 512ZM512 317.793103C541.252043 317.793103 564.965517 294.079633 564.965517 264.827586 564.965517 235.57554 541.252043 211.862069 512 211.862069 482.747957 211.862069 459.034483 235.57554 459.034483 264.827586 459.034483 294.079633 482.747957 317.793103 512 317.793103ZM476.689655 794.482759C476.689655 813.984124 492.498644 829.793103 512 829.793103 531.501356 829.793103 547.310345 813.984124 547.310345 794.482759L547.310345 406.068966C547.310345 386.567601 531.501356 370.758621 512 370.758621 492.498644 370.758621 476.689655 386.567601 476.689655 406.068966L476.689655 794.482759Z\" fill=\"#2D2D2D\" p-id=\"2935\"><\/path><\/svg>\n                    <\/div>\n                    <div v-if=\"hoverIndex === item.id\"\n                         class=\"absolute bottom-8 -right-20 transform  mb-2 w-64 px-3 py-2 bg-black text-white text-sm sc rounded shadow-lg z-10\">\n                        <p>{{ item.exchange_rules }}<\/p>\n                    <\/div>\n                <\/div>\n                <div class=\"p-4 flex flex-col h-full\">\n                    <span class=\"text-[15px] font-bold block -mb-1 sc text-ellipsis overflow-hidden whitespace-nowrap\" style=\"max-height: 1.2em; line-height: 1.2em;\">{{ item.name }}<\/span>\n                    <div class=\"flex items-center justify-between mt-5\">\n                        <div class=\"font-bold flex items-end space-x-1\">\n                            <span class=\"din text-xl\" style=\"color:#55DBFF\">{{ item.points_required }}<\/span>\n                            <span class=\"sc text-base self-end select-none\" style=\"color:#8C8C8C\">points<\/span>\n                        <\/div>\n                       <div v-if=\"user_info.points > item.points_required\">\n                           <a @click=\"modal_show(item)\" style=\"background:#2D2D2D;border-radius: 5px 5px 5px 5px;color: #FFFFFF;\" class=\"sc py-1 px-4 rounded cursor-pointer\">\n                               <span class=\"sc text-sm select-none\"> Redeem <\/span>\n                           <\/a>\n                       <\/div>\n                        <div v-else>\n                            <a @click=\"low_pts\" style=\"background: #D1D1D1;border-radius: 5px 5px 5px 5px;color: #FFFFFF;\" class=\"sc py-1 px-4 rounded cursor-pointer\">\n                                <span class=\"sc text-sm select-none\"> Low Pts <\/span>\n                            <\/a>\n                        <\/div>\n                    <\/div>\n                <\/div>\n            <\/div>\n        <\/div>\n        <div v-show=\"activeTab === 'records'\" class=\"px-8\" v-cloak>\n            <div v-if=\"exchange_orders.length > 0\">\n                <div class=\"overflow-x-auto\">\n                    <table class=\"min-w-full no-border-table\" style=\"border:none;\">\n                        <tr class=\"bg-[#FDF7E3]\">\n                            <th class=\"pb-3 text-left text-sm sc font-medium text-[#8C8C8C]\">Order ID<\/th>\n                            <th class=\"pb-3 text-left text-sm sc font-medium text-[#8C8C8C]\">Redeemed Product<\/th>\n                            <th class=\"pb-3 text-left text-sm sc font-medium text-[#8C8C8C]\">Points Spent<\/th>\n                            <th class=\"pb-3 text-left text-sm sc font-medium text-[#8C8C8C]\">Redemption Time<\/th>\n                            <th class=\"pb-3 text-left text-sm sc font-medium text-[#8C8C8C]\">Action<\/th>\n                        <\/tr>\n                        <tr v-for=\"record in exchange_orders\" :key=\"record.id\" class=\"border-b border-[#F0F0F0]\">\n                            <td class=\"py-4 text-sm sc text-[#2D2D2D]\">{{ record.order_id }}<\/td>\n                            <td class=\"py-4 text-sm sc text-[#2D2D2D]\">{{ record.product.name}}<\/td>\n                            <td class=\"py-4 text-sm sc text-[#2D2D2D]\">{{ record.points_used }}<\/td>\n                            <td class=\"py-4 text-sm sc text-[#2D2D2D]\">{{ record.delivered_at }}<\/td>\n                            <td class=\"py-4 text-sm sc text-[#2D2D2D]\">\n                               <a @click=\"exchange_details(record.id)\"><span class=\"px-4 py-1 rounded-full bg-[#A0D468] text-white cursor-pointer select-none\">Show Details<\/span><\/a>\n                            <\/td>\n                        <\/tr>\n                    <\/table>\n                <\/div>\n            <\/div>\n            <div v-else>\n                <el-empty description=\"No record of redemption\" \/>\n            <\/div>\n        <\/div>\n        <div v-cloak v-show=\"showConfirm\" class=\"fixed inset-0 flex items-center justify-center z-50 bg-gray-800 bg-opacity-50 backdrop-blur-sm transition-all duration-300\" style=\"z-index:999\">\n            <div class=\"max-w-2xl mx-auto bg-[#cffbfe] rounded-lg p-6 relative\">\n                <div class=\"flex justify-center mb-4\">\n                    <img decoding=\"async\" src=\"\/wp-content\/static\/img\/points\/cards\/zhong.png\"\n                         alt=\"zhong\"\n                         class=\"absolute -top-3 left-1\/2 -translate-x-1\/2 -translate-y-1\/2 w-20 sm:w-20 z-20\"\n                         style=\"will-change: transform;\">\n                <\/div>\n\n                <div class=\"text-center p-6\">\n                    <span class=\"text-[1.1rem] font-bold sc\">Are you sure you want to redeem this item for 1000 points?<\/span>\n                <\/div>\n\n                <div class=\"bg-white rounded-lg p-4 mb-4\">\n                    <div class=\"flex items-start mb-2\">\n                        <div class=\"text-sm text-yellow-600\">\ud83d\udd14Redemption Terms and Conditions<\/div>\n                    <\/div>\n                    <p class=\"text-[0.8rem] text-gray-700 mt-1 sc\" v-show=\"product.description\" v-html=\"formatMarkdown(product.exchange_rules)\">\n                    <\/p>\n                <\/div>\n\n                <div class=\"flex justify-center mt-6 space-x-24\">\n                    <a @click=\"modal_cancel\" style=\"background: #FFFFFF;border-radius: 30px 30px 30px 30px;border: 1px solid #55DBFF; \" class=\"sc py-1 px-10 rounded cursor-pointer\">\n                        <span class=\"sc text-[#55DBFF] select-none text-[0.8rem]\" style=\"font-style: normal;\"> Cancel <\/span>\n                    <\/a>\n\n                    <a @click=\"redeeming_good(product)\" style=\"background:#EE9448;border-radius: 30px 30px 30px 30px;\" class=\"sc py-1 px-10 rounded cursor-pointer\">\n                        <span class=\"sc text-[#FFFFFF] select-none text-[0.8rem]\" style=\"font-style: normal;\"> Redeem Now <\/span>\n                    <\/a>\n                <\/div>\n\n                <p class=\"text-[0.7rem] text-center text-[#797979] mt-2 sc\">\n                    Virtual items are non-returnable and non-exchangeable. Points deducted are non-refundable.\n                <\/p>\n            <\/div>\n        <\/div>\n        <div v-cloak v-show=\"jd_showConfirm\" class=\"fixed inset-0 backdrop-blur-sm transition-all duration-300\" style=\"z-index:999\">\n            <div class=\"w-full h-full flex items-center justify-center p-4\">\n                <!-- \u4eac\u4e1c\u5361\u5185\u5bb9 -->\n                <div class=\"relative welave\">\n                    <div>\n                        <img decoding=\"async\" src=\"\/wp-content\/static\/img\/points\/cards\/exchange\/jd.png\" class=\"max-w-full md:max-h-[580px]  object-contain rounded-lg shadow-2xl\" style=\"margin: 0 auto;\">\n                    <\/div>\n                    <!--\u5173\u95ed\u6309\u94ae-->\n                    <a @click=\"jd_showConfirm_close\" class=\"absolute md:top-8 top-4 right-0 cursor-pointer\">\n                        <img decoding=\"async\" src=\"\/wp-content\/static\/img\/points\/cards\/exchange\/close.png\" class=\"max-w-full md:max-h-32 max-h-16  object-contain\">\n                    <\/a>\n                    <!-- \u53d1\u9001Email\u6309\u94ae -->\n<!--                    <a @click=\"jd_showConfirm_send\" class=\"absolute bottom-4 left-[13.5rem] cursor-pointer\">-->\n<!--                        <img decoding=\"async\" src=\"\/wp-content\/static\/img\/points\/cards\/exchange\/send_email.png\" class=\"w-40 h-full object-contain\">-->\n<!--                    <\/a>-->\n                    <!--\u4e2d\u5fc3loading\u72b6\u6001-->\n                    <div v-if=\"!jd_card.jd_card_number || !jd_card.jd_card_password\" class=\"\">\n                        <div class=\"flex flex-col items-center justify-center absolute top-[58%] left-[55%] transform -translate-x-1\/2 -translate-y-1\/2\">\n                            <svg class=\"animate-spin h-10 w-10 text-white mb-4\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" fill=\"none\" viewbox=\"0 0 24 24\">\n                                <circle class=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" stroke-width=\"4\"><\/circle>\n                                <path class=\"opacity-75\" fill=\"currentColor\"\n                                      d=\"M4 12a8 8 0 018-8v8H4z\"><\/path>\n                            <\/svg>\n                        <\/div>\n                        <span class=\"text-white text-md sc absolute bottom-[20%] max-w-[35rem] left-[14%]\">Generating your card credentials, please do not close this window...<\/span>\n                    <\/div>\n\n                    <!-- Card Number \u548c Redeem Code \u90e8\u5206 -->\n                    <div v-else class=\"absolute top-[50%] left-[11%] p-4 w-[30rem]\">\n                        <div class=\"flex justify-center items-center mb-4\">\n                            <span class=\"text-white text-md sc\">Card Number:<\/span>\n                            <span class=\"text-white text-md sc ml-4\">{{jd_card.jd_card_number}}<\/span>\n                            <a @click=\"copyToClipboard(jd_card.jd_card_number)\" class=\"bg-white text-red-500 hover:text-red-500 sc text-md px-4 py-1 rounded-full ml-8 cursor-pointer select-none\">copy<\/a>\n                        <\/div>\n                        <div class=\"flex justify-center items-center pt-2\">\n                            <span class=\"text-white text-md sc\">Redeem Code:<\/span>\n                            <span class=\"text-white text-md sc ml-4\">{{jd_card.jd_card_password}}<\/span>\n                            <a @click=\"copyToClipboard(jd_card.jd_card_password)\" class=\"bg-white text-red-500 hover:text-red-500 sc text-md px-4 py-1 rounded-full ml-8 cursor-pointer select-none\">copy<\/a>\n                        <\/div>\n                    <\/div>\n\n                <\/div>\n            <\/div>\n        <\/div>\n        <div v-cloak v-show=\"tijian_showConfirm\" class=\"fixed inset-0 backdrop-blur-sm  transition-all duration-300\" style=\"z-index:999\">\n            <div class=\"w-full h-full flex items-center justify-center p-4\">\n                <!-- \u4eac\u4e1c\u5361\u5185\u5bb9 -->\n                <div class=\"relative welave\">\n                    <div>\n                        <img decoding=\"async\" src=\"\/wp-content\/static\/img\/points\/cards\/exchange\/tijian.png\" class=\"max-w-full md:max-h-[580px]  object-contain rounded-lg shadow-2xl\" style=\"margin: 0 auto;\">\n                    <\/div>\n                    <!--\u5173\u95ed\u6309\u94ae-->\n                    <a @click=\"tijian_showConfirm_close\" class=\"absolute md:top-4 top-2 right-0 cursor-pointer select-none\">\n                        <img decoding=\"async\" src=\"\/wp-content\/static\/img\/points\/cards\/exchange\/close.png\" class=\"max-w-full md:max-h-32 max-h-16  object-contain\">\n                    <\/a>\n                   <div v-if=\"tijian_card.coupon_code\">\n                       <!-- \u590d\u5236\u4f53\u68c0\u4f18\u60e0\u7801 -->\n                       <a @click=\"copyToClipboard(tijian_card.coupon_code)\" class=\"absolute top-[51%] right-[13%] cursor-pointer select-none\">\n                           <img decoding=\"async\" src=\"\/wp-content\/static\/img\/points\/cards\/exchange\/tijian_copy.png\" class=\"md:w-60 w-36 h-full object-contain\">\n                       <\/a>\n                   <\/div>\n                    <!-- Card Number \u548c Redeem Code \u90e8\u5206 -->\n                    <div v-if=\"!tijian_card.coupon_code\">\n                        <div class=\"flex flex-col items-center justify-center absolute top-[50%] left-[50%] transform -translate-x-1\/2 -translate-y-1\/2\">\n                            <div class='flex space-x-2'>\n                                <span class='sr-only'>Loading...<\/span>\n                                <div class='h-8 w-8 bg-black rounded-full animate-bounce [animation-delay:-0.3s]'><\/div>\n                                <div class='h-8 w-8 bg-black rounded-full animate-bounce [animation-delay:-0.15s]'><\/div>\n                                <div class='h-8 w-8 bg-black rounded-full animate-bounce'><\/div>\n                            <\/div>\n                        <\/div>\n                    <\/div>\n                    <div v-else class=\"absolute top-[33%] left-[16%] p-4\">\n                        <div class=\"flex flex-col justify-center items-center mb-4\">\n                            <span class=\"text-[#5ECEFC] text-4xl sc\">{{tijian_card.coupon_code}}<\/span>\n                            <span class=\"text-[#555555] text-sm sc mt-2\">Valid Until\uff1a{{tijian_card.expired_at}}<\/span>\n                        <\/div>\n                    <\/div>\n\n                <\/div>\n            <\/div>\n        <\/div>\n        <div v-if=\"point_showConfirm\" class=\"fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center\" style=\"z-index:999\">\n            <div class=\"bg-[#1C1C1E] w-[30rem] max-w-full rounded-xl p-6 z-50 text-white\">\n                <!-- \u5f39\u7a97\u5934\u90e8 -->\n                <div class=\"flex justify-between item-end mb-2\">\n                    <p class=\"text-lg font-semibold text-white\">Points Details<\/p>\n                    <a @click=\"point_showConfirm = false\" class=\"text-white text-2xl leading-none cursor-pointer\">&times;<\/a>\n                <\/div>\n                <!-- \u5207\u6362\u6807\u7b7e -->\n                <div class=\"flex items-center justify-between text-sm border-b border-[#333] mb-4\">\n                    <div v-for=\"(tab, index) in tabs\" :key=\"index\" @click=\"point_activeTab = tab.value\"\n                        :class=\"['px-12 py-2 cursor-pointer',point_activeTab === tab.value ? 'text-white border-b-2 border-white' : 'text-gray-400']\">\n                        {{ tab.label }}\n                    <\/div>\n                <\/div>\n                <!-- \u5217\u8868 -->\n                <div class=\"space-y-4 max-h-[400px] overflow-y-auto custom-scroll pr-4\">\n                    <div v-if=\"filteredRecords.length\" v-for=\"(item, index) in filteredRecords\" :key=\"index\" class=\"flex justify-between items-center text-sm\">\n                        <div>\n                            <div>{{ item.source }}<\/div>\n                            <div class=\"text-xs text-gray-400\">{{ item.date }}<\/div>\n                        <\/div>\n                        <div :class=\"item.amount > 0 ? 'text-[#58C0F2]' : 'text-white'\">\n                            {{ item.amount > 0 ? '+' + item.amount : item.amount }}\n                        <\/div>\n                    <\/div>\n                    <div v-else>\n                        <el-empty :description=\"point_activeTab === 'gain' ? 'No record of acquisition' : point_activeTab === 'spent' ? 'No record of consumption' : 'No record'\" \/>\n                    <\/div>\n                <\/div>\n            <\/div>\n        <\/div>\n        <div v-cloak v-show=\"shipping_showConfirm\" class=\"fixed inset-0 backdrop-blur-sm  transition-all duration-300\" style=\"z-index:999\">\n            <div class=\"w-full h-full flex items-center justify-center p-4\">\n                <!-- \u4eac\u4e1c\u5361\u5185\u5bb9 -->\n                <div class=\"relative welave\">\n                    <!--\u80cc\u666f\u56fe-->\n                    <div>\n                        <img decoding=\"async\" src=\"\/wp-content\/static\/img\/points\/cards\/shipping\/big.png\" class=\"max-w-full md:max-h-[37rem] object-contain rounded-lg shadow-2xl\" style=\"margin: 0 auto;\">\n                    <\/div>\n                    <!--\u5173\u95ed\u6309\u94ae-->\n                    <a @click=\"shipping_showConfirm_close\" class=\"absolute md:-top-12 -top-6 right-0 cursor-pointer select-none\">\n                        <img decoding=\"async\" src=\"\/wp-content\/static\/img\/points\/cards\/shipping\/close.png\" class=\"max-w-full md:max-h-32 max-h-16  object-contain\">\n                    <\/a>\n                    <!-- \u8868\u5355\u5185\u5bb9 -->\n                    <div v-if=\"!shipping_form_status.success\">\n                        <div class=\"absolute top-[22%] left-[10%] w-[80%] text-white element-plus-isolated\">\n                            <el-form :model=\"shipping_form\"  :rules=\"form_rules\" ref=\"formRef\" label-position=\"top\">\n                                <el-form-item label=\"Recipient\" prop=\"name\">\n                                    <el-input v-model=\"shipping_form.name\"\n                                              placeholder=\"Name\"\n                                              :style=\"{ '--el-input-placeholder-color': '#F0F7FF' }\"\n                                    \/>\n                                <\/el-form-item>\n\n                                <el-form-item label=\"Phone\" prop=\"phone\">\n                                    <el-input\n                                            v-model=\"shipping_form.phone\"\n                                            placeholder=\"Number\"\n                                            :style=\"{ '--el-input-placeholder-color': '#F0F7FF' }\"\n                                    \/>\n                                <\/el-form-item>\n\n                                <el-form-item label=\"Location\" prop=\"location\">\n                                    <el-input\n                                            v-model=\"shipping_form.location\"\n                                            placeholder=\"City \/ Province\"\n                                            :style=\"{ '--el-input-placeholder-color': '#F0F7FF' }\"\n                                    \/>\n                                <\/el-form-item>\n\n                                <el-form-item label=\"Street Address\" prop=\"address\">\n                                    <el-input\n                                            v-model=\"shipping_form.address\"\n                                            placeholder=\"Street \/ Building\"\n                                            type=\"textarea\"\n                                            :rows=\"3\"\n                                            :style=\"{ '--el-input-placeholder-color': '#F0F7FF' }\"\n                                    \/>\n                                <\/el-form-item>\n                            <\/el-form>\n                        <\/div>\n                        <div>\n                            <!-- \u590d\u5236\u4f53\u68c0\u4f18\u60e0\u7801 -->\n                            <a @click=\"submitForm\" class=\"absolute bottom-[6%] right-[9%] cursor-pointer select-none\">\n                                <img decoding=\"async\" src=\"\/wp-content\/static\/img\/points\/cards\/shipping\/submit.png\" class=\"md:w-96 w-36 h-full object-contain\">\n                            <\/a>\n                        <\/div>\n                    <\/div>\n                    <div v-else>\n                        <div class=\"absolute top-[45%] left-[10%] w-[80%] text-white text-center\">\n                            <div class=\"flex items-center justify-center w-20 h-20 mx-auto mb-6 bg-green-100 rounded-full dark:bg-green-700\">\n                                <svg class=\"h-12 w-12 text-green-600 dark:text-green-100\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" fill=\"none\" viewbox=\"0 0 24 24\"\n                                     stroke-width=\"1.5\" stroke=\"currentColor\" aria-hidden=\"true\" data-slot=\"icon\">\n                                    <path stroke-linecap=\"round\" stroke-linejoin=\"round\"\n                                          d=\"M9 12.75 11.25 15 15 9.75M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Z\"><\/path>\n                                <\/svg>\n                            <\/div>\n                            <p class=\"mt-4 text-xl text-gray-700 dark:text-gray-400\">\n                                You've submitted your shipping address. Your card will be mailed to you soon.\n                            <\/p>\n                        <\/div>\n                    <\/div>\n                <\/div>\n            <\/div>\n        <\/div>\n        <div v-cloak v-show=\"flywire_showConfirm\" class=\"fixed inset-0 backdrop-blur-sm  transition-all duration-300\" style=\"z-index:999\">\n            <div class=\"w-full h-full flex items-center justify-center p-4\">\n                <div class=\"relative welave\">\n                    <div>\n                        <img decoding=\"async\" src=\"\/wp-content\/static\/img\/points\/cards\/flywire\/fly_content.png\" class=\"max-w-full md:max-h-[580px]  object-contain rounded-lg shadow-2xl\" style=\"margin: 0 auto;\">\n                    <\/div>\n                    <a @click=\"flywire_showConfirm_close\" class=\"absolute md:top-6 top-2 right-0 cursor-pointer select-none\">\n                        <img decoding=\"async\" src=\"\/wp-content\/static\/img\/points\/cards\/exchange\/close.png\" class=\"max-w-full md:max-h-32 max-h-16  object-contain\">\n                    <\/a>\n                    <div v-if=\"flywire_card.code\" class=\"absolute bottom-[5%] right-[13%] flex gap-16 items-center\">\n                        <!-- \u590d\u5236\u4f53\u68c0\u4f18\u60e0\u7801 -->\n                        <a @click=\"copyToClipboard(flywire_card.code)\" class=\"cursor-pointer select-none\">\n                            <img decoding=\"async\" src=\"\/wp-content\/static\/img\/points\/cards\/flywire\/copy.png\" class=\"md:w-36 w-36 h-full object-contain\">\n                        <\/a>\n                        <!--\u8df3\u8f6c\u6309\u94ae-->\n                        <a @click=\"flywire_pay\" class=\"cursor-pointer select-none\">\n                            <img decoding=\"async\" src=\"\/wp-content\/static\/img\/points\/cards\/flywire\/pay.png\" class=\"md:w-36 w-36 h-full object-contain\">\n                        <\/a>\n                    <\/div>\n                    <!-- Card Number \u548c Redeem Code \u90e8\u5206 -->\n                    <div v-if=\"!flywire_card.code\">\n                        <div class=\"flex flex-col items-center justify-center absolute bottom-[20%] left-[49%] transform -translate-x-1\/2 -translate-y-1\/2\">\n                            <div class='flex space-x-2'>\n                                <span class='sr-only'>Loading...<\/span>\n                                <div class='h-8 w-8 bg-black rounded-full animate-bounce [animation-delay:-0.3s]'><\/div>\n                                <div class='h-8 w-8 bg-black rounded-full animate-bounce [animation-delay:-0.15s]'><\/div>\n                                <div class='h-8 w-8 bg-black rounded-full animate-bounce'><\/div>\n                            <\/div>\n                        <\/div>\n                    <\/div>\n                    <div v-else class=\"absolute bottom-[15%] left-[25%] p-4\">\n                        <div class=\"flex flex-col justify-center items-center mb-4\">\n                            <span class=\"text-[#FF4A1F] text-5xl sc\">{{flywire_card.code}}<\/span>\n                        <\/div>\n                    <\/div>\n\n                <\/div>\n            <\/div>\n        <\/div>\n    <\/div>\n<\/div>\n\n<script>\n    const { createApp, ref, onMounted,reactive,computed } = Vue;\n    const { ElMessage } = ElementPlus;  \/\/ \u5f15\u5165 Element Plus \u7684 Message\n    const app = createApp({\n        setup(){\n            const big_loading = ref(false); \/\/\u5168\u5c40loading\n            const activeTab = ref('shop'); \/\/Tabs\u6807\u7b7e\u9875\n            const products = ref([]);\n            const product = ref([])\n            const exchange_orders = ref([])\n            const token = ref(null);\n            const base_img_url = ref('https:\/\/agent.goglobalsafe.com\/storage\/')\n            const user_info = ref([]);\n            const hoverIndex = ref(null);\n            const showConfirm = ref(false); \/\/\u5151\u6362\u8be2\u95ee\u6846\n            const jd_showConfirm = ref(false);  \/\/\u4eac\u4e1c\u5361\u7ed3\u679c\u5f39\u7a97\n            const point_showConfirm = ref(false); \/\/\u6253\u5f00\u79ef\u5206\u6d41\u6c34\u8be6\u60c5\u5f39\u7a97\n            const flywire_showConfirm = ref(false); \/\/\u98de\u6c47\u5f39\u7a97\n            const tabs = [\n                { label: 'gained', value: 'gain' },\n                { label: 'consume', value: 'spent' },\n\n            ];\n            const point_activeTab = ref('gain');\n            const records_points = ref([]);\n            const filteredRecords = computed(() => {\n                if (point_activeTab.value === 'gain') {\n                    return records_points.value.filter(r => r.amount > 0);\n                }\n                if (point_activeTab.value === 'spent') {\n                    return records_points.value.filter(r => r.amount < 0);\n                }\n                return records_points.value;\n            });\n            const formRef = ref(null)\n            \/\/\u83b7\u53d6\u672c\u5730\u7535\u8bdd\u5361\u5151\u6362\u72b6\u6001\n            const getShippingStatus = ()=>{\n                const stored = localStorage.getItem('localShippingKey');\n                return stored ? JSON.parse(stored) : { form_status: false, success: false, id:null };\n            }\n            const shipping_form = reactive({\n                id: getShippingStatus().id,\n                name:'',\n                phone:'',\n                location:'',\n                address:''\n            })\n            const jd_card = reactive({\n                jd_card_number:null,\n                jd_card_password:null\n            })\n            const tijian_card = reactive({\n                coupon_code:null,\n                expired_at:null\n            })\n            const flywire_card = reactive({\n                code:''\n            })\n\n            const tijian_showConfirm = ref(false); \/\/\u5965\u7f8e\u5609\u4f53\u68c0\u4f18\u60e0\u5238\n            const shipping_showConfirm = ref(false); \/\/\u7535\u8bdd\u5361\u6536\u8d27\u5730\u5740\n\n            const shipping_form_status = reactive({\n                form_status : getShippingStatus().form_status, \/\/\u662f\u5426\u5df2\u7ecf\u5151\u6362\u8fc7\u843d\u5730\u5361\n                success : getShippingStatus().success \/\/\u662f\u5426\u5df2\u7ecf\u5151\u6362\u8fc7\u6d1b\u8482\u5361  \u5e76\u4e14\u63d0\u4ea4\u8fc7\u6536\u8d27\u5730\u5740\n            })\n            const md = new window.markdownit(); \/\/ \u4f7f\u7528\u5168\u5c40\u7684 markdown-it\n\n            const product_api = 'https:\/\/agent.goglobalsafe.com\/api\/v1\/student\/user\/point\/products';\n            const user_api = 'https:\/\/agent.goglobalsafe.com\/api\/v1\/student\/user\/userinfo'\n            const product_exchange_api = 'https:\/\/agent.goglobalsafe.com\/api\/v1\/student\/user\/point\/exchange'\n            const product_exchange_jd_api = 'https:\/\/agent.goglobalsafe.com\/api\/v1\/student\/user\/point\/exchange\/jd'\n            const product_exchange_omega_api = 'https:\/\/agent.goglobalsafe.com\/api\/v1\/student\/user\/point\/exchange\/omega'\n            const exchange_orders_api = 'https:\/\/agent.goglobalsafe.com\/api\/v1\/student\/user\/point\/redemptions'\n            const fetch_point_records = 'https:\/\/agent.goglobalsafe.com\/api\/v1\/student\/user\/point\/fetchPointFlowRecords'\n            const shipping_api = 'https:\/\/agent.goglobalsafe.com\/api\/v1\/student\/user\/phone-card\/address'\n\n            \/\/ \u683c\u5f0f\u5316 Markdown \u5185\u5bb9\n            const formatMarkdown = (content) => {\n                if (!content) return '';\n                return md.render(content);\n            };\n            \/\/ \u683c\u5f0f\u5316\u4ef7\u683c\n            const formatPrice = (price) => {\n                if (!price) return 'N\/A'; \/\/ \u9ed8\u8ba4\u4ef7\u683c\n                return price.replace('.', '') === price ? `\u00a5${price}.00` : `\u00a5${price}`;\n            };\n            \/\/\u521d\u59cb\u5316\u65b9\u6cd5\n            const init = async ()=>{\n                token.value = localStorage.getItem('student_token');\n                const requests = [await fetchProducts(),await fetchUserInfo(),await redemption_orders(),await fetchPointsData()];\n                await Promise.all(requests);\n                console.log('\u6267\u884c\u521d\u59cb\u5316\u65b9\u6cd5')\n            }\n            const form_rules = {\n                name: [{ required: true, message: 'Please enter recipient name', trigger: 'blur' }],\n                phone: [{ required: true, message: 'Please enter phone number', trigger: 'blur' }],\n                location: [{ required: true, message: 'Please enter location', trigger: 'blur' }],\n                address: [{ required: true, message: 'Please enter address', trigger: 'blur' }]\n            }\n            \/\/\u83b7\u53d6\u79ef\u5206\u5546\u54c1\n            const fetchProducts = async ()=>{\n                big_loading.value = true;\n                try {\n                    const response = await axios.post(product_api,{},{\n                        headers:{\n                            \"Authorization\": 'Bearer '+ token.value,\n                            \"Accept\":\"application\/json\"\n                        }\n                    })\n                    console.log(response);\n                    if (response.data.success){\n                        products.value = response.data.data\n                    }else {\n                        products.value = [];\n                        ElMessage.error('Network Error!')\n                    }\n\n                }catch(error){\n                    ElMessage.error('Failed to load products');\n                }finally{\n                    big_loading.value = false;\n                }\n            }\n            \/\/\u83b7\u53d6\u5151\u6362\u8bb0\u5f55\n            const redemption_orders = async ()=>{\n                try {\n                    const response = await axios.post(exchange_orders_api,{\n                        page:1,\n                        per_page:10\n                    },{\n                        headers:{\n                            \"Authorization\": 'Bearer '+ token.value,\n                            \"Accept\":\"application\/json\"\n                        }\n                    })\n                    exchange_orders.value = response.data.data.list\n                    console.log('\u5151\u6362\u8bb0\u5f55',exchange_orders.value);\n                }catch (error){\n                    console.log(error)\n                    ElMessage.error('Unable to load exchange order list');\n                }\n            }\n            \/\/\u83b7\u53d6\u5f53\u524d\u67e5\u770b\u7684\u5151\u6362\u8bb0\u5f55\u8be6\u60c5\n            const exchange_details = async (order_id)=>{\n                console.log(order_id)\n                const matched = exchange_orders.value.find(order => order.id === order_id);\n                console.log(matched);\n                if (!matched) {\n                    ElMessage({\n                        message:'network error',\n                        type:'warning',\n                        duration: 2000\n                    })\n                }\n                console.log(matched.type)\n                \/\/\u6839\u636e\u7c7b\u578b\u663e\u793a\u4e0d\u540c\u5f39\u7a97\n                switch (matched.type) {\n                    case 'physical_exam_coupon':\n                        tijian_card.coupon_code = matched.delivery_data.coupon_code\n                        tijian_card.expired_at = matched.delivery_data.expired_at\n                        tijian_showConfirm.value = true;\n                        break;\n                    case 'template_card':\n                        jd_card.jd_card_number = matched.delivery_data.card_number\n                        jd_card.jd_card_password = matched.delivery_data.card_password\n                        jd_showConfirm.value = true;\n                        break;\n                    case 'phone':\n                        ElMessage.success('Please wait patiently. Your order is being shipped.')\n                        break;\n                    case 'student_discount':\n                        ElMessage.success('student_discount.')\n                        break;\n                    default:\n                        break;\n                }\n\n            }\n            \/\/\u67e5\u770b\u79ef\u5206\u6d41\u6c34\u8be6\u60c5\n            const points_details = async()=>{\n                point_showConfirm.value = true\n            }\n            \/\/\u83b7\u53d6\u79ef\u5206\u6d41\u6c34\n            const fetchPointsData = async ()=>{\n                try {\n                    const response = await axios.post(fetch_point_records,{},{\n                        headers:{\n                            \"Authorization\": 'Bearer '+ token.value,\n                            \"Accept\":\"application\/json\"\n                        }\n                    })\n                    console.log('\u79ef\u5206\u6d41\u6c34',response.data.data);\n                    records_points.value = response.data.data\n                }catch (error){\n                    ElMessage.error('Network Error');\n                }\n            }\n            \/\/\u79ef\u5206\u5546\u57ce\n            const rewaeds_store = async()=>{\n                await(fetchProducts());\n            }\n            \/\/\u5361\u5305\n            const my_wallet = async()=>{\n                ElMessage({\n                    message:'In Development',\n                    type:'warning',\n                    duration: 2000\n                })\n            }\n            \/\/\u8054\u7cfb\u5ba2\u670d\n            const contact_support = async()=>{\n                window.open('https:\/\/work.weixin.qq.com\/ca\/cawcde8e13009ad3ba');\n            }\n            \/\/\u98de\u6c47\u5f39\u7a97pay_now\n            const flywire_pay = async()=>{\n                window.open('https:\/\/www.baidu.com');\n            }\n            \/\/\u79ef\u5206\u4e0d\u8db3\n            const low_pts = async()=>{\n                ElMessage({\n                    message:'not enough points',\n                    type:'warning',\n                    duration: 2000\n                })\n            }\n            \/\/\u5f00\u59cb\u5151\u6362\u5546\u54c1\n            const redeeming_good = async(product)=>{\n                console.log(product.name);\n                showConfirm.value = false;\n                \/\/\u6253\u5f00loading\n                big_loading.value = true;\n                \/\/\u5f00\u59cb\u5151\u6362\u5546\u54c1\n                console.log(product.product_type);\n                if (product.product_type === 'phone'){\n                    console.log(1233333333);\n                    if (shipping_form_status.form_status){\n                        \/\/\u5151\u6362\u8fc7\u6536\u8d27\u5730\u5740\n                        big_loading.value = false;\n                        shipping_showConfirm.value = true  \/\/\u6253\u5f00\u6536\u8d27\u5730\u5740\u5f39\u7a97\n                    }else {\n                        \/\/\u8fd8\u672a\u5151\u6362 \u8d70\u5151\u6362\u6536\u8d27\u5730\u5740\n                        console.log('\u8d70\u5151\u6362\u6536\u8d27\u5730\u5740');\n                        await exchange(product.id);\n                    }\n                }else {\n                    await exchange(product.id);\n                }\n                product.value = [];\n            }\n            \/\/\u5f00\u59cb\u5151\u6362\u5546\u54c1api\n            const exchange = async(id)=>{\n                \/\/\u6a21\u62dfapi\u8bf7\u6c42\n                try {\n                    const response = await axios.post(product_exchange_api,{\n                        product_id:id,\n                        count:1\n                    },{\n                        headers:{\n                            \"Authorization\": 'Bearer '+ token.value,\n                            \"Accept\":\"application\/json\"\n                        }\n                    })\n                    let message = '\u5546\u54c1\u5151\u6362\u6210\u529f';\n                    console.log(response);\n                    console.log(response.data.data.redemptions[0].product_type);\n                    if (response.data.data.redemptions[0].product_type){\n                        switch (response.data.data.redemptions[0].product_type){\n                            case 'template_card':\n                                \/\/\u8f6e\u8be2\u63a5\u53e3 \u76f4\u5230\u83b7\u53d6\u5361\u53f7\n                                jd_showConfirm.value = true;\n                                await exchange_jd_api();\n                                message = 'Jingdong Card Redemption Success';\n                                break;\n                            case 'physical_exam_coupon':\n                                tijian_showConfirm.value = true;\n                                await exchange_tijian_api();\n                                message = 'New Omega Health Checkup Coupon Redemption Successful';\n                                break;\n                            case 'phone':\n                                if (response.data.data.redemptions[0].card_data.form){\n                                    shipping_showConfirm.value = true;\n                                    shipping_form.id = response.data.data.redemptions[0].id\n                                    \/\/\u5b58\u50a8\u81ea\u5b9a\u4e49\n                                    const data = {\n                                        id:response.data.data.redemptions[0].id,\n                                        form_status:true, \/\/\u5151\u6362\u4e86\u843d\u5730\u5361\n                                        success:false, \/\/\u672a\u586b\u5199\u843d\u5730\u5361\u6536\u8d27\u5730\u5740\n                                    }\n                                    localStorage.setItem('localShippingKey', JSON.stringify(data));\n                                    message = 'Phone Card Redemption Successful';\n                                }else {\n                                    message = 'Phone Card Redemption Successful';\n                                }\n                                break;\n                            default:\n                                message = 'Successful redemption';\n                        }\n                        ElMessage({\n                            message: message,\n                            type:'success',\n                            duration: 3000\n                        })\n                        await fetchUserInfo();\n                        await redemption_orders();\n                        await fetchPointsData();\n                    }else {\n                        ElMessage.error('Redemption failed Contact customer service!')\n                        console.log(123);\n                    }\n                }catch (error){\n                    console.log(error)\n                    console.log(error.response)\n                    ElMessage.error(error.response.data.message)\n                    console.log(456);\n                }finally {\n                    big_loading.value = false;\n                }\n            }\n            \/\/\u5f00\u59cb\u67e5\u8be2\u4eac\u4e1c\u5361\u5151\u6362\u7ed3\u679c\n            const exchange_jd_api = async ()=>{\n                setTimeout(async ()=>{\n                    const response = await axios.post(product_exchange_jd_api,{},{\n                        headers:{\n                            \"Authorization\": 'Bearer '+ token.value,\n                            \"Accept\":\"application\/json\"\n                        }\n                    })\n                    console.log(response);\n                    const jd_card_content = response.data.data.coupon;\n                    if (jd_card_content && jd_card_content.card_number){\n                        \/\/\u6210\u529f\u62ff\u5230\u5361\u53f7\u5361\u5bc6\n                        jd_card.jd_card_number = jd_card_content.card_number\n                        jd_card.jd_card_password = jd_card_content.card_password\n                    }else {\n                        jd_showConfirm.value = false;\n                        ElMessage({\n                            message:'The display of the Jingdong card coupon failed, please check the redemption record manually later or contact customer service\u3002',\n                            type:'warning',\n                            duration: 2500\n                        })\n                    }\n                },2500);\n            }\n            \/\/\u5f00\u59cb\u67e5\u8be2\u5965\u7f8e\u5609\u4f53\u68c0\u5238\u5151\u6362\u7ed3\u679c\n            const exchange_tijian_api = async()=>{\n                setTimeout(async ()=>{\n                    const response = await axios.post(product_exchange_omega_api,{},{\n                        headers:{\n                            \"Authorization\": 'Bearer '+ token.value,\n                            \"Accept\":\"application\/json\"\n                        }\n                    })\n                    console.log(response);\n                    const omega_card_content = response.data.data.physical_coupon;\n                    if (omega_card_content && omega_card_content.coupon_code){\n                        \/\/\u6210\u529f\u62ff\u5230\u4f53\u68c0\u5238\u7801 \u548c\u8fc7\u671f\u65e5\u671f\n                        tijian_card.coupon_code = omega_card_content.coupon_code\n                        tijian_card.expired_at = omega_card_content.expired_at\n                    }else {\n                        tijian_showConfirm.value = false;\n                        ElMessage({\n                            message:'Omega voucher code display failed, please check the redemption record manually later or contact customer service\u3002',\n                            type:'warning',\n                            duration: 2500\n                        })\n                    }\n                },2500);\n            }\n            \/\/\u4eac\u4e1c\u5361\u5238\u5f39\u7a97\u5173\u95ed\n            const jd_showConfirm_close = ()=>{\n                \/\/\u5173\u95ed\u5361\u5238\n                jd_showConfirm.value = false;\n                \/\/ \u91cd\u7f6e jd_card \u7684\u503c\uff08\u91cd\u65b0\u521d\u59cb\u5316\uff09\n                jd_card.jd_card_number = null;\n                jd_card.jd_card_password = null;\n            }\n            \/\/\u5965\u7f8e\u5609\u4f53\u68c0\u4f18\u60e0\u5238\u5f39\u7a97\u5173\u95ed\n            const tijian_showConfirm_close = ()=>{\n                \/\/\u5173\u95ed\u5f39\u7a97\n                console.log('\u5173\u95ed\u4f18\u60e0\u5238');\n                tijian_showConfirm.value = false;\n                tijian_card.coupon_code = null;\n                tijian_card.expired_at = null;\n            }\n            \/\/\u98de\u6c47\u4f18\u60e0\u7801\u5f39\u7a97\u5173\u95ed\n            const flywire_showConfirm_close = ()=>{\n                flywire_showConfirm.value = false;\n                console.log('\u5173\u95ed\u98de\u6c47\u4f18\u60e0\u7801\u5f39\u7a97')\n            }\n            \/\/\u7535\u8bdd\u5361\u6536\u8d27\u5730\u5740\u5f39\u7a97\u5173\u95ed\n            const shipping_showConfirm_close = ()=>{\n                shipping_showConfirm.value = false\n            }\n            \/\/\u7535\u8bdd\u5361\u6536\u8d27\u5730\u5740 \u63d0\u4ea4\n            const submitForm = async () => {\n                formRef.value.validate(valid => {\n                    if (valid) {\n                        console.log(shipping_form);\n                        big_loading.value = true;\n                        submit_shipping_submit()\n                    } else {\n                        ElMessage.warning('Please complete the form')\n                    }\n                })\n            }\n            \/\/\u8bf7\u6c42\u6536\u8d27\u5730\u5740\u63a5\u53e3\n            const submit_shipping_submit = async()=>{\n                try {\n                    const response = await axios.post(shipping_api,{\n                        redemption_id:shipping_form.id,\n                        receiver_name:shipping_form.name,\n                        receiver_phone:shipping_form.phone,\n                        region:shipping_form.location,\n                        address:shipping_form.address\n                    },{\n                        headers:{\n                            \"Authorization\": 'Bearer '+ token.value,\n                            \"Accept\":\"application\/json\"\n                        }\n                    })\n                    ElMessage.success('Submitted successfully')\n                    big_loading.value = false;\n                    shipping_form_status.success = true;\n                    localStorage.removeItem('localShippingKey')\n                    shipping_form.id = null\n                }catch (error){\n                    big_loading.value = false;\n                    ElMessage.warning('Delivery address submission failed')\n                    shipping_form_status.success = false;\n                    console.log(error)\n                }\n            }\n            \/\/\u4eac\u4e1c\u5361\u5238\u53d1\u9001Email\n            const jd_showConfirm_send = async ()=>{\n                ElMessage({\n                    message:'JD Email \u53d1\u9001\u6210\u529f',\n                    type:'success',\n                    duration: 3000\n                })\n            }\n            \/\/\u590d\u5236\u529f\u80fd\n            const copyToClipboard = async (code)=>{\n                try {\n                    if (navigator.clipboard){\n                        \/\/ \u4f7f\u7528\u73b0\u4ee3\u526a\u8d34\u677f API\n                        await navigator.clipboard.writeText(code);\n                    }else {\n                        \/\/ \u56de\u9000\u5230\u4f20\u7edf\u65b9\u6cd5\n                        const textarea = document.createElement('textarea');\n                        textarea.value = code;\n                        document.body.appendChild(textarea);\n                        textarea.select();\n                        document.execCommand('copy');\n                        document.body.removeChild(textarea);\n                    }\n                    ElMessage({\n                        message: 'Copy Success',\n                        type: 'success',\n                        duration: 2000\n                    });\n                }catch (err) {\n                    console.error('\u590d\u5236\u5931\u8d25:', err);\n                    ElMessage.error('Copy failed, please copy manually')\n                }\n            }\n            \/\/\u67e5\u770b\u4e2a\u4eba\u4fe1\u606f\n            const fetchUserInfo = async ()=>{\n                try {\n                    const response = await axios.get(user_api,{\n                        headers:{\n                            \"Authorization\": 'Bearer '+ token.value,\n                        }\n                    })\n                    user_info.value = response.data.data;\n                    console.log(user_info.value);\n                    \/\/ \u5b58\u50a8 user_info\n                    localStorage.setItem('user_info', JSON.stringify(response.data.data));\n                }catch (error){\n                    console.error(error)\n                    ElMessage({\n                        message: 'Failed to get information',\n                        type: 'warning',\n                    })\n                    \/\/\u8bf4\u660e\u670d\u52a1\u7aefToken\u8fc7\u671f\n                    localStorage.removeItem('student_token')\n                    localStorage.removeItem('user_info')\n                    window.location.href = '\/student-login'\n                    console.error('\u9000\u51fa\u767b\u5f55')\n                }\n            }\n            \/\/\u5173\u95ed\u5f39\u7a97 \u6309\u94ae\n            const modal_cancel = ()=>{\n                product.value = []\n                showConfirm.value = false;\n            }\n            \/\/\u6253\u5f00\u5f39\u7a97\u6309\u94ae\n            const modal_show = (item)=>{\n                console.log(item);\n                product.value = item\n                showConfirm.value = true\n            }\n            onMounted(()=>{\n                big_loading.value = true;\n                if (!localStorage.getItem('student_token')){\n                    window.location.href = '\/student-login'\n                }else {\n                    init()\n                }\n            })\n            return {\n                big_loading,\n                products,\n                activeTab,\n                user_info,\n                base_img_url,\n                formatPrice,\n                points_details,\n                rewaeds_store,\n                my_wallet,\n                contact_support,\n                low_pts,\n                redeeming_good,\n                hoverIndex,\n                modal_cancel,\n                modal_show,\n                showConfirm,\n                product,\n                formatMarkdown,\n                jd_showConfirm,\n                tijian_showConfirm,\n                shipping_showConfirm,\n                jd_showConfirm_close,\n                tijian_showConfirm_close,\n                shipping_showConfirm_close,\n                jd_showConfirm_send,\n                copyToClipboard,\n                exchange_orders,\n                jd_card,\n                tijian_card,\n                exchange_tijian_api,\n                exchange_details,\n                point_showConfirm,\n                tabs,\n                point_activeTab,\n                filteredRecords,\n                records_points,\n                shipping_form,\n                form_rules,\n                submitForm,\n                formRef,\n                shipping_form_status,\n                flywire_showConfirm,\n                flywire_showConfirm_close,\n                flywire_card,\n                flywire_pay\n            }\n        }\n    });\n    app.use(ElementPlus);\n    app.mount(\"#app\")\n<\/script>\n\n\n<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<\/div>","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"site-sidebar-layout":"default","site-content-layout":"default","ast-global-header-display":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","theme-transparent-header-meta":"default","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","footnotes":""},"class_list":["post-35857","page","type-page","status-publish","hentry"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v22.6 (Yoast SEO v26.4) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Points Mall | GoGlobalsafe-\u7559\u5b66\u751f\u4fdd\u9669\u4e00\u7ad9\u5f0f\u89e3\u51b3\u65b9\u6848<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.goglobalsafe.com\/points-mall\/\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Points Mall\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.goglobalsafe.com\/points-mall\/\" \/>\n<meta property=\"og:site_name\" content=\"GoGlobalsafe-\u7559\u5b66\u751f\u4fdd\u9669\u4e00\u7ad9\u5f0f\u89e3\u51b3\u65b9\u6848\" \/>\n<meta property=\"article:modified_time\" content=\"2025-05-09T09:37:45+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/ggs.uat.goglobalsafe.com\/wp-content\/uploads\/2023\/04\/LOGO1.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1000\" \/>\n\t<meta property=\"og:image:height\" content=\"1000\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4\" \/>\n\t<meta name=\"twitter:data1\" content=\"1 \u5206\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.goglobalsafe.com\/points-mall\/\",\"url\":\"https:\/\/www.goglobalsafe.com\/points-mall\/\",\"name\":\"Points Mall | GoGlobalsafe-\u7559\u5b66\u751f\u4fdd\u9669\u4e00\u7ad9\u5f0f\u89e3\u51b3\u65b9\u6848\",\"isPartOf\":{\"@id\":\"https:\/\/www.goglobalsafe.com\/#website\"},\"datePublished\":\"2025-05-09T09:33:00+00:00\",\"dateModified\":\"2025-05-09T09:37:45+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.goglobalsafe.com\/points-mall\/#breadcrumb\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.goglobalsafe.com\/points-mall\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.goglobalsafe.com\/points-mall\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u9996\u9875\",\"item\":\"https:\/\/www.goglobalsafe.com\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Points Mall\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.goglobalsafe.com\/#website\",\"url\":\"https:\/\/www.goglobalsafe.com\/\",\"name\":\"GoGlobalSafe Student Insurance\",\"description\":\"Your Health, Our Priority\",\"publisher\":{\"@id\":\"https:\/\/www.goglobalsafe.com\/#organization\"},\"alternateName\":\"GoGlobalSafe international student insurance\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.goglobalsafe.com\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"zh-Hans\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.goglobalsafe.com\/#organization\",\"name\":\"Golobal student consulting limited\",\"alternateName\":\"GoGlobalSafe\",\"url\":\"https:\/\/www.goglobalsafe.com\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.goglobalsafe.com\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/ggs.uat.goglobalsafe.com\/wp-content\/uploads\/2023\/04\/LOGO3.png\",\"contentUrl\":\"https:\/\/ggs.uat.goglobalsafe.com\/wp-content\/uploads\/2023\/04\/LOGO3.png\",\"width\":500,\"height\":140,\"caption\":\"Golobal student consulting limited\"},\"image\":{\"@id\":\"https:\/\/www.goglobalsafe.com\/#\/schema\/logo\/image\/\"}}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Points Mall | GoGlobalsafe-\u7559\u5b66\u751f\u4fdd\u9669\u4e00\u7ad9\u5f0f\u89e3\u51b3\u65b9\u6848","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.goglobalsafe.com\/points-mall\/","og_locale":"zh_CN","og_type":"article","og_title":"Points Mall","og_url":"https:\/\/www.goglobalsafe.com\/points-mall\/","og_site_name":"GoGlobalsafe-\u7559\u5b66\u751f\u4fdd\u9669\u4e00\u7ad9\u5f0f\u89e3\u51b3\u65b9\u6848","article_modified_time":"2025-05-09T09:37:45+00:00","og_image":[{"width":1000,"height":1000,"url":"https:\/\/ggs.uat.goglobalsafe.com\/wp-content\/uploads\/2023\/04\/LOGO1.png","type":"image\/png"}],"twitter_card":"summary_large_image","twitter_misc":{"\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"1 \u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.goglobalsafe.com\/points-mall\/","url":"https:\/\/www.goglobalsafe.com\/points-mall\/","name":"Points Mall | GoGlobalsafe-\u7559\u5b66\u751f\u4fdd\u9669\u4e00\u7ad9\u5f0f\u89e3\u51b3\u65b9\u6848","isPartOf":{"@id":"https:\/\/www.goglobalsafe.com\/#website"},"datePublished":"2025-05-09T09:33:00+00:00","dateModified":"2025-05-09T09:37:45+00:00","breadcrumb":{"@id":"https:\/\/www.goglobalsafe.com\/points-mall\/#breadcrumb"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.goglobalsafe.com\/points-mall\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.goglobalsafe.com\/points-mall\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9875","item":"https:\/\/www.goglobalsafe.com\/"},{"@type":"ListItem","position":2,"name":"Points Mall"}]},{"@type":"WebSite","@id":"https:\/\/www.goglobalsafe.com\/#website","url":"https:\/\/www.goglobalsafe.com\/","name":"GoGlobalSafe \u5b66\u751f\u4fdd\u9669","description":"\u60a8\u7684\u5065\u5eb7\uff0c\u6211\u4eec\u7684\u9996\u8981\u4efb\u52a1","publisher":{"@id":"https:\/\/www.goglobalsafe.com\/#organization"},"alternateName":"GoGlobalSafe international student insurance","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.goglobalsafe.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"zh-Hans"},{"@type":"Organization","@id":"https:\/\/www.goglobalsafe.com\/#organization","name":"\u73af\u7403\u5b66\u751f\u54a8\u8be2\u6709\u9650\u516c\u53f8","alternateName":"GoGlobalSafe","url":"https:\/\/www.goglobalsafe.com\/","logo":{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.goglobalsafe.com\/#\/schema\/logo\/image\/","url":"https:\/\/ggs.uat.goglobalsafe.com\/wp-content\/uploads\/2023\/04\/LOGO3.png","contentUrl":"https:\/\/ggs.uat.goglobalsafe.com\/wp-content\/uploads\/2023\/04\/LOGO3.png","width":500,"height":140,"caption":"Golobal student consulting limited"},"image":{"@id":"https:\/\/www.goglobalsafe.com\/#\/schema\/logo\/image\/"}}]}},"_links":{"self":[{"href":"https:\/\/ggs.uat.goglobalsafe.com\/zh\/wp-json\/wp\/v2\/pages\/35857","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ggs.uat.goglobalsafe.com\/zh\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/ggs.uat.goglobalsafe.com\/zh\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/ggs.uat.goglobalsafe.com\/zh\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/ggs.uat.goglobalsafe.com\/zh\/wp-json\/wp\/v2\/comments?post=35857"}],"version-history":[{"count":3,"href":"https:\/\/ggs.uat.goglobalsafe.com\/zh\/wp-json\/wp\/v2\/pages\/35857\/revisions"}],"predecessor-version":[{"id":35861,"href":"https:\/\/ggs.uat.goglobalsafe.com\/zh\/wp-json\/wp\/v2\/pages\/35857\/revisions\/35861"}],"wp:attachment":[{"href":"https:\/\/ggs.uat.goglobalsafe.com\/zh\/wp-json\/wp\/v2\/media?parent=35857"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}