- Add BASE_PATH config, include all routers with prefix
- Inject {{ base }} Jinja2 global for all template URLs
- Add window.BASE_PATH for static JS files
- Update Nginx to proxy /careerbot/ path
- Add OPS_MANUAL.md
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
81 lines
3.6 KiB
HTML
81 lines
3.6 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="zh-CN">
|
|
<head>
|
|
<meta charset="UTF-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
<title>CareerBot Admin - Access Tokens</title>
|
|
<link rel="stylesheet" href="{{ base }}/static/css/style.css">
|
|
</head>
|
|
<body>
|
|
<div class="admin-layout">
|
|
<aside class="admin-sidebar">
|
|
<div class="logo">CareerBot Admin</div>
|
|
<nav>
|
|
<a href="{{ base }}/admin/dashboard"><span class="icon">■</span> Dashboard</a>
|
|
<a href="{{ base }}/admin/profile"><span class="icon">☺</span> Profile</a>
|
|
<a href="{{ base }}/admin/education"><span class="icon">☆</span> Education</a>
|
|
<a href="{{ base }}/admin/experience"><span class="icon">✎</span> Experience</a>
|
|
<a href="{{ base }}/admin/skills"><span class="icon">★</span> Skills</a>
|
|
<a href="{{ base }}/admin/tokens"><span class="icon">⚷</span> Access Tokens</a>
|
|
<a href="{{ base }}/admin/messages"><span class="icon">✉</span> Messages <span class="nav-badge" id="nav-badge" style="display:none;"></span></a>
|
|
<a href="{{ base }}/admin/llm-config"><span class="icon">⚙</span> LLM Config</a>
|
|
<a href="{{ base }}/admin/resume"><span class="icon">✍</span> Resume Gen</a>
|
|
<a href="#" onclick="adminLogout()"><span class="icon">→</span> Logout</a>
|
|
</nav>
|
|
</aside>
|
|
<main class="admin-content">
|
|
<div class="admin-header">
|
|
<h2>Access Tokens</h2>
|
|
<button class="btn btn-primary" onclick="generateToken()">+ Generate Token</button>
|
|
</div>
|
|
<div class="admin-card">
|
|
<table class="data-table">
|
|
<thead><tr><th>Token</th><th>Note</th><th>Questions</th><th>Status</th><th>Created</th><th>Actions</th></tr></thead>
|
|
<tbody id="tokens-tbody"></tbody>
|
|
</table>
|
|
</div>
|
|
</main>
|
|
</div>
|
|
|
|
<!-- Edit Token Modal -->
|
|
<div class="modal-overlay" id="token-modal">
|
|
<div class="modal" style="max-width:480px;">
|
|
<div class="modal-header">
|
|
<h3>Edit Token</h3>
|
|
<button onclick="closeModal('token-modal')">×</button>
|
|
</div>
|
|
<div class="modal-body">
|
|
<input type="hidden" id="token-edit-id">
|
|
<div class="form-group">
|
|
<label>Note</label>
|
|
<input type="text" id="token-edit-note" placeholder="e.g. Recruiter from Company X">
|
|
</div>
|
|
<div class="form-group">
|
|
<label>Max Questions</label>
|
|
<input type="number" id="token-edit-max" min="1" value="10">
|
|
</div>
|
|
<div class="form-group">
|
|
<label>Used Questions</label>
|
|
<input type="number" id="token-edit-used" min="0" value="0">
|
|
<small style="color:#64748b;">Set to 0 to reset the counter and allow more questions.</small>
|
|
</div>
|
|
<div class="form-group">
|
|
<label>Status</label>
|
|
<select id="token-edit-active">
|
|
<option value="true">Active</option>
|
|
<option value="false">Inactive</option>
|
|
</select>
|
|
</div>
|
|
</div>
|
|
<div class="modal-footer">
|
|
<button class="btn" onclick="closeModal('token-modal')">Cancel</button>
|
|
<button class="btn btn-primary" onclick="saveToken()">Save</button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<script>window.BASE_PATH = "{{ base }}";</script>
|
|
<script src="{{ base }}/static/js/admin.js"></script>
|
|
</body>
|
|
</html>
|