315 lines
13 KiB
HTML
315 lines
13 KiB
HTML
<!doctype html>
|
|
<html lang="zh-CN">
|
|
<head>
|
|
<meta charset="utf-8" />
|
|
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
<title>管理后台</title>
|
|
<link rel="stylesheet" href="/static/styles.css?v=20260615-summary-review-drawer" />
|
|
</head>
|
|
<body>
|
|
<header class="topbar">
|
|
<div>
|
|
<h1>管理后台</h1>
|
|
<p id="adminHealthText">正在读取管理状态</p>
|
|
</div>
|
|
<div class="top-actions">
|
|
<a class="nav-button" href="/">课程记录</a>
|
|
<a class="nav-button" href="/admin/logout">退出</a>
|
|
<button id="refreshBtn" class="icon-button" title="刷新" type="button" aria-label="刷新">↻</button>
|
|
</div>
|
|
</header>
|
|
|
|
<main class="layout account-layout admin-layout">
|
|
<nav class="admin-tabs" aria-label="管理后台功能">
|
|
<button class="admin-tab is-active" data-admin-tab="accounts" type="button">课时账户</button>
|
|
<button class="admin-tab" data-admin-tab="reviews" type="button">纠错审核</button>
|
|
<button class="admin-tab" data-admin-tab="summaries" type="button">课程小结审核</button>
|
|
<button class="admin-tab" data-admin-tab="summarySearch" type="button">课程小结查询</button>
|
|
<button class="admin-tab" data-admin-tab="logs" type="button">操作记录</button>
|
|
<button class="admin-tab" data-admin-tab="register" type="button">登记</button>
|
|
</nav>
|
|
|
|
<section id="accountsPanel" class="panel admin-panel">
|
|
<div class="section-head">
|
|
<h2>课时账户</h2>
|
|
<div class="quick-actions">
|
|
<select id="accountStatus" aria-label="账户状态筛选">
|
|
<option value="">全部状态</option>
|
|
<option value="欠费">欠费</option>
|
|
<option value="预警">预警</option>
|
|
<option value="正常">正常</option>
|
|
<option value="结课">结课</option>
|
|
<option value="退费">退费</option>
|
|
</select>
|
|
<button id="newAccountBtn" class="chip" type="button">新增账户</button>
|
|
</div>
|
|
</div>
|
|
<form id="accountForm" class="search-row account-search-row">
|
|
<input id="accountQuery" autocomplete="off" placeholder="学生姓名或学生ID" />
|
|
<button type="submit">查询</button>
|
|
</form>
|
|
<div id="accountMeta" class="summary-grid"></div>
|
|
<div id="accountEditor" class="admin-editor" hidden>
|
|
<div class="section-head compact-head">
|
|
<h2 id="accountEditorTitle">新增账户</h2>
|
|
<button id="cancelAccountEditBtn" class="secondary-button" type="button">取消</button>
|
|
</div>
|
|
<form id="accountEditForm" class="admin-form">
|
|
<div class="form-grid">
|
|
<label>
|
|
学生ID
|
|
<input id="editStudentId" autocomplete="off" placeholder="新增时自动生成" />
|
|
</label>
|
|
<label>
|
|
学生姓名
|
|
<input id="editStudent" autocomplete="off" required />
|
|
</label>
|
|
<label>
|
|
剩余课时
|
|
<input id="editRemaining" inputmode="decimal" required />
|
|
</label>
|
|
<label>
|
|
账户状态
|
|
<select id="editStatus">
|
|
<option value="正常">正常</option>
|
|
<option value="预警">预警</option>
|
|
<option value="欠费">欠费</option>
|
|
<option value="结课">结课</option>
|
|
<option value="退费">退费</option>
|
|
</select>
|
|
</label>
|
|
<label class="span-2">
|
|
缴费记录
|
|
<textarea id="editPayments" rows="4" placeholder="每行一条:2026-06-01:53"></textarea>
|
|
</label>
|
|
<label class="span-2">
|
|
备注
|
|
<textarea id="editNote" rows="3"></textarea>
|
|
</label>
|
|
</div>
|
|
<p id="accountEditError" class="correction-error" hidden></p>
|
|
<div class="modal-actions">
|
|
<button type="submit">保存账户</button>
|
|
</div>
|
|
</form>
|
|
</div>
|
|
<div class="table-wrap account-table-wrap">
|
|
<table>
|
|
<thead>
|
|
<tr>
|
|
<th>学生</th>
|
|
<th>状态</th>
|
|
<th class="num">剩余课时</th>
|
|
<th>缴费记录</th>
|
|
<th>备注</th>
|
|
<th>操作</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody id="accountRows"></tbody>
|
|
</table>
|
|
</div>
|
|
</section>
|
|
|
|
<section id="reviewsPanel" class="panel admin-panel" hidden>
|
|
<div class="section-head">
|
|
<h2>纠错审核</h2>
|
|
<select id="reviewStatus" aria-label="审核状态筛选">
|
|
<option value="pending">待审核</option>
|
|
<option value="conflict">冲突</option>
|
|
<option value="approved">已批准</option>
|
|
<option value="rejected">已驳回</option>
|
|
<option value="">全部状态</option>
|
|
</select>
|
|
</div>
|
|
<div id="reviewMeta" class="summary-grid"></div>
|
|
<div class="table-wrap">
|
|
<table>
|
|
<thead>
|
|
<tr>
|
|
<th>编号</th>
|
|
<th>状态</th>
|
|
<th>原记录</th>
|
|
<th>修改后</th>
|
|
<th>提交时间</th>
|
|
<th>操作</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody id="reviewRows"></tbody>
|
|
</table>
|
|
</div>
|
|
</section>
|
|
|
|
<section id="summariesPanel" class="panel admin-panel" hidden>
|
|
<div class="section-head">
|
|
<h2>课程小结审核</h2>
|
|
<select id="summaryReviewStatus" aria-label="课程小结审核状态筛选">
|
|
<option value="pending">待审核</option>
|
|
<option value="conflict">冲突</option>
|
|
<option value="approved">已批准</option>
|
|
<option value="rejected">已驳回</option>
|
|
<option value="">全部状态</option>
|
|
</select>
|
|
</div>
|
|
<div id="summaryReviewMeta" class="summary-grid"></div>
|
|
<div class="table-wrap">
|
|
<table>
|
|
<thead>
|
|
<tr>
|
|
<th>编号</th>
|
|
<th>状态</th>
|
|
<th>课程信息</th>
|
|
<th>候选记录</th>
|
|
<th>小结原文</th>
|
|
<th>原因</th>
|
|
<th>操作</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody id="summaryReviewRows"></tbody>
|
|
</table>
|
|
</div>
|
|
</section>
|
|
|
|
<div id="summaryReviewDrawerBackdrop" class="drawer-backdrop" hidden>
|
|
<aside class="summary-review-drawer" role="dialog" aria-modal="true" aria-labelledby="summaryReviewDrawerTitle">
|
|
<div class="drawer-head">
|
|
<div>
|
|
<h2 id="summaryReviewDrawerTitle">课程小结详情</h2>
|
|
<div id="summaryReviewDrawerMeta" class="drawer-meta"></div>
|
|
</div>
|
|
<button id="summaryReviewDrawerClose" class="modal-close" type="button">关闭</button>
|
|
</div>
|
|
<div class="drawer-content">
|
|
<div class="drawer-section">
|
|
<div class="drawer-label">状态</div>
|
|
<div id="summaryReviewDrawerStatus"></div>
|
|
</div>
|
|
<div class="drawer-section">
|
|
<div class="drawer-label">课程信息</div>
|
|
<div id="summaryReviewDrawerCourse" class="drawer-text"></div>
|
|
</div>
|
|
<div class="drawer-section">
|
|
<div class="drawer-label">建议登记行</div>
|
|
<div id="summaryReviewDrawerLine"></div>
|
|
</div>
|
|
<div class="drawer-section">
|
|
<div class="drawer-label">审核原因</div>
|
|
<div id="summaryReviewDrawerReasons" class="drawer-text"></div>
|
|
</div>
|
|
<div class="drawer-section">
|
|
<div class="drawer-label">小结原文</div>
|
|
<div id="summaryReviewDrawerBody" class="drawer-body"></div>
|
|
</div>
|
|
<div class="drawer-section">
|
|
<div class="drawer-label">来源</div>
|
|
<div id="summaryReviewDrawerSource" class="drawer-text"></div>
|
|
</div>
|
|
</div>
|
|
<div class="drawer-actions">
|
|
<button id="summaryReviewDrawerReject" class="secondary-button" type="button">驳回</button>
|
|
<button id="summaryReviewDrawerApprove" type="button">批准</button>
|
|
</div>
|
|
</aside>
|
|
</div>
|
|
|
|
<section id="summarySearchPanel" class="panel admin-panel" hidden>
|
|
<div class="section-head">
|
|
<h2>课程小结查询</h2>
|
|
</div>
|
|
<form id="summarySearchForm" class="search-row summary-search-row">
|
|
<input id="summarySearchQuery" autocomplete="off" placeholder="关键词:课堂内容、作业、问题等" />
|
|
<input id="summarySearchStudent" autocomplete="off" placeholder="学生" />
|
|
<input id="summarySearchTeacher" autocomplete="off" placeholder="老师" />
|
|
<input id="summarySearchSubject" autocomplete="off" placeholder="科目" />
|
|
<input id="summarySearchDateFrom" type="date" aria-label="开始日期" />
|
|
<input id="summarySearchDateTo" type="date" aria-label="结束日期" />
|
|
<button type="submit">查询</button>
|
|
</form>
|
|
<div id="summarySearchMeta" class="summary-grid"></div>
|
|
<div class="table-wrap">
|
|
<table>
|
|
<thead>
|
|
<tr>
|
|
<th>日期</th>
|
|
<th>学生</th>
|
|
<th>老师/科目</th>
|
|
<th>标题</th>
|
|
<th>小结正文</th>
|
|
<th>来源</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody id="summarySearchRows"></tbody>
|
|
</table>
|
|
</div>
|
|
</section>
|
|
|
|
<section id="logsPanel" class="panel admin-panel" hidden>
|
|
<div class="section-head">
|
|
<h2>操作记录</h2>
|
|
<div class="quick-actions">
|
|
<select id="logOperation" aria-label="操作类型筛选">
|
|
<option value="">全部操作</option>
|
|
<option value="course_summary_ingest">小结接收</option>
|
|
<option value="admin_task_approve">审核批准</option>
|
|
<option value="admin_task_reject">审核驳回</option>
|
|
</select>
|
|
<select id="logStatus" aria-label="操作结果筛选">
|
|
<option value="">全部结果</option>
|
|
<option value="auto_registered">自动入账</option>
|
|
<option value="review">待审核</option>
|
|
<option value="duplicate">重复</option>
|
|
<option value="rejected">失败/驳回</option>
|
|
<option value="approved">已批准</option>
|
|
</select>
|
|
</div>
|
|
</div>
|
|
<form id="logFilterForm" class="search-row log-search-row">
|
|
<input id="logStudent" autocomplete="off" placeholder="按学生筛选" />
|
|
<button type="submit">筛选</button>
|
|
</form>
|
|
<div id="logMeta" class="summary-grid"></div>
|
|
<div class="table-wrap">
|
|
<table>
|
|
<thead>
|
|
<tr>
|
|
<th>时间</th>
|
|
<th>操作</th>
|
|
<th>结果</th>
|
|
<th>学生</th>
|
|
<th>批次/任务</th>
|
|
<th>详情</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody id="logRows"></tbody>
|
|
</table>
|
|
</div>
|
|
</section>
|
|
|
|
<section id="registerPanel" class="panel admin-panel" hidden>
|
|
<div class="section-head">
|
|
<h2>登记</h2>
|
|
</div>
|
|
<div class="register-grid">
|
|
<form id="classRegisterForm" class="admin-form">
|
|
<h3>上课记录登记</h3>
|
|
<textarea id="classRegisterLines" rows="10" placeholder="每行一条上课记录"></textarea>
|
|
<p id="classRegisterStatus" class="inline-account-loading"></p>
|
|
<div class="modal-actions">
|
|
<button type="submit">提交上课记录</button>
|
|
</div>
|
|
</form>
|
|
<form id="paymentRegisterForm" class="admin-form">
|
|
<h3>缴费登记</h3>
|
|
<textarea id="paymentRegisterLines" rows="10" placeholder="每行一条:学生-2026-06-01:53"></textarea>
|
|
<p id="paymentRegisterStatus" class="inline-account-loading"></p>
|
|
<div class="modal-actions">
|
|
<button type="submit">提交缴费记录</button>
|
|
</div>
|
|
</form>
|
|
</div>
|
|
</section>
|
|
</main>
|
|
|
|
<script src="/static/admin.js?v=20260615-summary-review-drawer"></script>
|
|
</body>
|
|
</html>
|