{"id":7406,"date":"2025-11-05T08:57:31","date_gmt":"2025-11-05T01:57:31","guid":{"rendered":"https:\/\/tokuteigino.vn\/?page_id=7406"},"modified":"2026-04-16T10:35:50","modified_gmt":"2026-04-16T03:35:50","slug":"dang-nhap","status":"publish","type":"page","link":"https:\/\/tokuteigino.vn\/ja\/dang-nhap\/","title":{"rendered":"\u0110\u0103ng nh\u1eadp"},"content":{"rendered":"<!DOCTYPE html>\n<html lang=\"vi\">\n<head>\n<meta charset=\"UTF-8\" \/>\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no\" \/>\n<title>\u0110\u0103ng Nh\u1eadp H\u1ec7 Th\u1ed1ng<\/title>\n<link href=\"https:\/\/fonts.googleapis.com\/css2?family=Roboto:wght@400;500;700&#038;display=swap\" rel=\"stylesheet\">\n\n<style>\n:root {\n    --primary-color: #0f2819; \n    --error-color: #dc2626;\n    --text-main: #111827;\n}\n\n.tmy-login { \n    font-family: 'Roboto', sans-serif; \n    -webkit-font-smoothing: antialiased;\n}\n\n.tmy-login * {\n    box-sizing: border-box; \/* S\u1eeda l\u1ed7i tr\u00e0n khung *\/\n}\n\n.tmy-login .popup { \n    position: fixed; \n    inset: 0; \n    background: rgba(0,0,0,0.8); \n    display: flex; \n    justify-content: center; \n    align-items: center; \n    z-index: 9999; \n    padding: 15px; \n    backdrop-filter: blur(4px); \n}\n\n.tmy-login .popup-content { \n    background: #ffffff; \n    padding: 35px 25px; \n    border-radius: 16px; \n    width: 100%; \n    max-width: 380px; \n    position: relative; \n    box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.5);\n}\n\n\/* N\u00fat \u0111\u00f3ng Popup *\/\n.tmy-login .close-btn {\n    position: absolute;\n    top: 15px;\n    right: 15px;\n    font-size: 22px;\n    color: #9ca3af;\n    cursor: pointer;\n    transition: color 0.2s;\n    line-height: 1;\n}\n.tmy-login .close-btn:hover {\n    color: var(--error-color);\n}\n\n.tmy-login .login-title { \n    text-align: center; \n    margin-bottom: 25px; \n    font-size: 24px; \n    color: var(--primary-color); \n    font-weight: 700;\n}\n\n.tmy-login .login-input { \n    width: 100%; \n    height: 52px; \n    padding: 0 15px; \n    margin-bottom: 16px; \n    font-size: 16px; \n    border: 1.5px solid #e5e7eb; \n    border-radius: 10px; \n    outline: none; \n    transition: all 0.3s;\n    background: #fdfdfd;\n}\n\n.tmy-login input#password {\n    padding-right: 45px;\n}\n\n.tmy-login .login-input:focus { \n    border-color: var(--primary-color); \n    box-shadow: 0 0 0 4px rgba(15, 40, 25, 0.1); \n    background: #fff;\n}\n\n.tmy-login .password-wrap { \n    position: relative; \n    width: 100%;\n}\n\n.tmy-login .toggle-pwd { \n    position: absolute; \n    right: 12px; \n    top: 26px; \n    transform: translateY(-50%); \n    cursor: pointer; \n    color: #6b7280;\n    display: flex;\n    align-items: center;\n    padding: 5px;\n}\n\n.tmy-login .login-btn { \n    width: 100%; \n    height: 54px; \n    font-size: 17px; \n    font-weight: 700; \n    background: var(--primary-color); \n    color: #ffffff; \n    border: none; \n    border-radius: 12px; \n    cursor: pointer; \n    margin-top: 10px; \n    transition: all 0.2s ease;\n}\n\n.tmy-login .login-btn:hover {\n    background: #163a24;\n}\n\n.tmy-login .login-btn:active { transform: scale(0.98); }\n.tmy-login .login-btn:disabled { opacity: 0.7; cursor: not-allowed; }\n\n.spinner { display: none; width: 20px; height: 20px; border: 3px solid rgba(255,255,255,0.3); border-radius: 50%; border-top-color: #fff; animation: spin 1s linear infinite; margin-right: 10px; }\n@keyframes spin { to { transform: rotate(360deg); } }\n\n.login-btn-content { display: flex; justify-content: center; align-items: center; }\n<\/style>\n<\/head>\n<body>\n<div class=\"tmy-login\">\n  <div class=\"popup\">\n    <div class=\"popup-content\">\n      <span class=\"close-btn\" onclick=\"goHome()\">\u2715<\/span>\n      \n      <h3 class=\"login-title\">\u0110\u0102NG NH\u1eacP<\/h3>\n      \n      <input id=\"tmy_userId\" type=\"text\" class=\"login-input\" placeholder=\"Email\" autocomplete=\"username\" \/>\n      \n      <div class=\"password-wrap\">\n        <input id=\"password\" class=\"login-input\" type=\"password\" placeholder=\"M\u1eadt kh\u1ea9u\" autocomplete=\"current-password\" \/>\n        <span id=\"togglePwd\" class=\"toggle-pwd\">\n          <svg width=\"20\" height=\"20\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M1 12s4-7 11-7 11 7 11 7-4 7-11 7-11-7-11-7z\"><\/path><circle cx=\"12\" cy=\"12\" r=\"3\"><\/circle><\/svg>\n        <\/span>\n      <\/div>\n      \n      <button id=\"loginBtn\" class=\"login-btn\">\n        <div class=\"login-btn-content\">\n          <div id=\"loader\" class=\"spinner\"><\/div> <span id=\"btnText\">V\u00e0o h\u1ecdc ngay<\/span>\n        <\/div>\n      <\/button>\n      \n      <p style=\"text-align:center; color:#9ca3af; font-size:13px; margin-top:20px;\">Thanh Mai Yokohama &#8211; Tokutei Gino<\/p>\n    <\/div>\n  <\/div>\n<\/div>\n\n<script>\nconst CONFIG = {\n    \/\/ L\u01b0u \u00fd: C\u1eadp nh\u1eadt URL Apps Script c\u1ee7a b\u1ea1n t\u1ea1i \u0111\u00e2y\n    scriptUrl: \"https:\/\/script.google.com\/macros\/s\/AKfycbyUlrzqJTp-PTtc53wVc9XJZykuC0i99Vxprv4CzgO6iMZZyYUb822F9ClPTbgqixWj\/exec\",\n    redirectUrl: \"https:\/\/tokuteigino.vn\/vi\/khoa-hoc-cua-toi\/\",\n    primaryColor: \"#0f2819\"\n};\n\nfunction goHome() {\n    window.location.href = \"https:\/\/tokuteigino.vn\/vi\/\";\n}\n\ndocument.getElementById(\"loginBtn\").onclick = async function() {\n    const userId = document.getElementById(\"tmy_userId\").value.trim();\n    const pw = document.getElementById(\"password\").value.trim();\n    const btn = this;\n    const loader = document.getElementById(\"loader\");\n    const btnText = document.getElementById(\"btnText\");\n\n    if (!userId || !pw) {\n        alert(\"Vui l\u00f2ng nh\u1eadp \u0111\u1ea7y \u0111\u1ee7!\");\n        return;\n    }\n\n    btn.disabled = true;\n    loader.style.display = \"inline-block\";\n    btnText.textContent = \"\u0110ang ki\u1ec3m tra...\";\n\n    const url = `${CONFIG.scriptUrl}?action=checkUserId&tmy_userId=${encodeURIComponent(userId)}&password=${encodeURIComponent(pw)}`;\n\n    try {\n        const res = await fetch(url);\n        const result = await res.json();\n\n        if (result.exists && !result.isExpired) {\n            localStorage.setItem(\"tmy_userId\", userId);\n            localStorage.setItem(\"tmy_userName\", result.tmy_userName || \"\");\n            localStorage.setItem(\"tmy_classIds\", JSON.stringify(result.tmy_classIds || []));\n            localStorage.setItem(\"tmy_courseStartDates\", JSON.stringify(result.tmy_courseStartDates || {}));\n            localStorage.setItem(\"tmy_studentStatus\", result.tmy_studentStatus || \"\");\n            localStorage.setItem(\"tmy_learningMode\", result.tmy_learningMode || \"\");\n\n            if (result.tmy_studentStatus === \"2. \u0110\u00e3 \u0111\u1ed7\") {\n                alert(\"B\u1ea1n \u0111\u00e3 ho\u00e0n th\u00e0nh kh\u00f3a h\u1ecdc!\");\n                goHome();\n            } else {\n                window.location.href = CONFIG.redirectUrl;\n            }\n        } else {\n            alert(result.isExpired ? \"T\u00e0i kho\u1ea3n h\u1ebft h\u1ea1n 180 ng\u00e0y!\" : \"Email ho\u1eb7c m\u1eadt kh\u1ea9u kh\u00f4ng \u0111\u00fang!\");\n            resetBtn();\n        }\n    } catch (e) {\n        alert(\"L\u1ed7i k\u1ebft n\u1ed1i m\u00e1y ch\u1ee7.\");\n        resetBtn();\n    }\n};\n\nfunction resetBtn() {\n    const btn = document.getElementById(\"loginBtn\");\n    const loader = document.getElementById(\"loader\");\n    const btnText = document.getElementById(\"btnText\");\n    btn.disabled = false;\n    loader.style.display = \"none\";\n    btnText.textContent = \"V\u00e0o h\u1ecdc ngay\";\n}\n\ndocument.getElementById(\"togglePwd\").onclick = function() {\n    const input = document.getElementById(\"password\");\n    if (input.type === \"password\") {\n        input.type = \"text\";\n        this.style.color = CONFIG.primaryColor;\n    } else {\n        input.type = \"password\";\n        this.style.color = \"#6b7280\";\n    }\n};\n<\/script>\n<\/body>\n<\/html>","protected":false},"excerpt":{"rendered":"<p>\u0110\u0103ng Nh\u1eadp H\u1ec7 Th\u1ed1ng \u2715 \u0110\u0102NG NH\u1eacP V\u00e0o h\u1ecdc ngay Thanh Mai Yokohama &#8211; Tokutei Gino<\/p>","protected":false},"author":2,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"footnotes":""},"class_list":["post-7406","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/tokuteigino.vn\/ja\/wp-json\/wp\/v2\/pages\/7406","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/tokuteigino.vn\/ja\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/tokuteigino.vn\/ja\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/tokuteigino.vn\/ja\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/tokuteigino.vn\/ja\/wp-json\/wp\/v2\/comments?post=7406"}],"version-history":[{"count":28,"href":"https:\/\/tokuteigino.vn\/ja\/wp-json\/wp\/v2\/pages\/7406\/revisions"}],"predecessor-version":[{"id":8381,"href":"https:\/\/tokuteigino.vn\/ja\/wp-json\/wp\/v2\/pages\/7406\/revisions\/8381"}],"wp:attachment":[{"href":"https:\/\/tokuteigino.vn\/ja\/wp-json\/wp\/v2\/media?parent=7406"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}