| <!DOCTYPE html> |
| <html lang="zh-CN" class="h-full bg-gray-50"> |
| <head> |
| <meta charset="UTF-8"> |
| <meta name="viewport" content="width=device-width, initial-scale=1.0"> |
| <title>登录 - Z.AI2API 管理后台</title> |
|
|
| |
| <script src="https://cdn.tailwindcss.com"></script> |
|
|
| |
| <script defer src="https://cdn.jsdelivr.net/npm/alpinejs@3.x.x/dist/cdn.min.js"></script> |
|
|
| <style> |
| .gradient-bg { |
| background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); |
| } |
| </style> |
| </head> |
| <body class="h-full"> |
| <div class="min-h-full flex items-center justify-center py-12 px-4 sm:px-6 lg:px-8"> |
| <div class="max-w-md w-full space-y-8"> |
| |
| <div> |
| <div class="mx-auto h-16 w-16 flex items-center justify-center rounded-full gradient-bg"> |
| <svg class="h-10 w-10 text-white" fill="none" viewBox="0 0 24 24" stroke="currentColor"> |
| <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 15v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2zm10-10V7a4 4 0 00-8 0v4h8z" /> |
| </svg> |
| </div> |
| <h2 class="mt-6 text-center text-3xl font-extrabold text-gray-900"> |
| Z.AI2API 管理后台 |
| </h2> |
| <p class="mt-2 text-center text-sm text-gray-600"> |
| 请输入管理密码以继续 |
| </p> |
| </div> |
|
|
| |
| <div class="mt-8 space-y-6" |
| x-data="{ |
| password: '', |
| loading: false, |
| error: '', |
| async login() { |
| if (!this.password) { |
| this.error = '请输入密码'; |
| return; |
| } |
| |
| this.loading = true; |
| this.error = ''; |
| |
| try { |
| const response = await fetch('/admin/api/login', { |
| method: 'POST', |
| headers: { |
| 'Content-Type': 'application/json', |
| }, |
| body: JSON.stringify({ password: this.password }) |
| }); |
| |
| const data = await response.json(); |
| |
| if (response.ok && data.success) { |
| window.location.href = '/admin'; |
| } else { |
| this.error = data.message || '密码错误,请重试'; |
| } |
| } catch (err) { |
| this.error = '登录失败,请稍后重试'; |
| } finally { |
| this.loading = false; |
| } |
| } |
| }"> |
|
|
| |
| <div x-show="error" |
| x-transition |
| class="bg-red-50 border-l-4 border-red-400 p-4"> |
| <div class="flex"> |
| <div class="flex-shrink-0"> |
| <svg class="h-5 w-5 text-red-400" viewBox="0 0 20 20" fill="currentColor"> |
| <path fill-rule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zM8.707 7.293a1 1 0 00-1.414 1.414L8.586 10l-1.293 1.293a1 1 0 101.414 1.414L10 11.414l1.293 1.293a1 1 0 001.414-1.414L11.414 10l1.293-1.293a1 1 0 00-1.414-1.414L10 8.586 8.707 7.293z" clip-rule="evenodd" /> |
| </svg> |
| </div> |
| <div class="ml-3"> |
| <p class="text-sm text-red-700" x-text="error"></p> |
| </div> |
| </div> |
| </div> |
|
|
| |
| <form @submit.prevent="login" class="mt-8 space-y-6"> |
| <div class="rounded-md shadow-sm -space-y-px"> |
| <div> |
| <label for="password" class="sr-only">密码</label> |
| <input |
| id="password" |
| name="password" |
| type="password" |
| autocomplete="current-password" |
| required |
| x-model="password" |
| class="appearance-none rounded-md relative block w-full px-3 py-3 border border-gray-300 placeholder-gray-500 text-gray-900 focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 focus:z-10 sm:text-sm" |
| placeholder="请输入管理密码" |
| @keydown.enter="login"> |
| </div> |
| </div> |
|
|
| <div> |
| <button |
| type="submit" |
| :disabled="loading" |
| class="group relative w-full flex justify-center py-3 px-4 border border-transparent text-sm font-medium rounded-md text-white bg-indigo-600 hover:bg-indigo-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500 disabled:opacity-50 disabled:cursor-not-allowed transition-colors"> |
| <span class="absolute left-0 inset-y-0 flex items-center pl-3"> |
| <svg class="h-5 w-5 text-indigo-500 group-hover:text-indigo-400" viewBox="0 0 20 20" fill="currentColor" aria-hidden="true"> |
| <path fill-rule="evenodd" d="M10 1a4.5 4.5 0 00-4.5 4.5V9H5a2 2 0 00-2 2v6a2 2 0 002 2h10a2 2 0 002-2v-6a2 2 0 00-2-2h-.5V5.5A4.5 4.5 0 0010 1zm3 8V5.5a3 3 0 10-6 0V9h6z" clip-rule="evenodd" /> |
| </svg> |
| </span> |
| <span x-show="!loading">登录</span> |
| <span x-show="loading" class="flex items-center"> |
| <svg class="animate-spin -ml-1 mr-3 h-5 w-5 text-white" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24"> |
| <circle class="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="4"></circle> |
| <path class="opacity-75" fill="currentColor" d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"></path> |
| </svg> |
| 登录中... |
| </span> |
| </button> |
| </div> |
| </form> |
|
|
| |
| <div class="text-center"> |
| <p class="text-xs text-gray-500"> |
| 默认密码:admin123(请在 .env 中修改 ADMIN_PASSWORD) |
| </p> |
| </div> |
| </div> |
| </div> |
| </div> |
| </body> |
| </html> |
|
|