| ID | 用户名 | 姓名 | 角色 | 状态 | 备注 | 创建时间 | 操作 |
|---|---|---|---|---|---|---|---|
| {{ u.id }} | {{ u.username }} | {{ u.name }} | {{ u.is_active ? '启用' : '停用' }} | {{ clip(u.remark, 25) || '-' }} | {{ fmtDate(u.created_at) }} |
| 姓名 | 性别 | 签约时间 | 套餐 | 负责老师 | 已完课 | 未上课天 | 操作 |
|---|---|---|---|---|---|---|---|
|
{{ s.name }}
{{ s.name }}
{{ s.contract_status }} · {{ s.contract_date }}
基本情况
{{ s.basic_info }} 最高学历:{{ s.highest_degree }}
本科:{{ s.undergrad_school }} {{ s.undergrad_major }}({{ s.undergrad_start }}~{{ s.undergrad_end }})
硕士:{{ s.master_school }} {{ s.master_major }}({{ s.master_start }}~{{ s.master_end }})
博士:{{ s.phd_school }} {{ s.phd_major }}({{ s.phd_start }}~{{ s.phd_end }})
|
{{ s.gender || '-' }} | {{ s.contract_date || '-' }} | {{ s.package_name || '-' }} | {{ s.teacher_names.join('、') || '-' }} | {{ s.completed_lessons }} | {{ s.unattended_days }} | |
| 暂无学员{{ me.role==='coach' ? '(你只能看到分配给你的学员)' : '' }},点击右上角新建 | |||||||
共 {{ sTotal }} 条
第 {{ sPage }} / {{ sPages }} 页
| 学员 | 面试公司 | 面试岗位 | 轮次 | 结果 | 日期 | 备注 | 操作 |
|---|---|---|---|---|---|---|---|
| {{ e.student_name }} | {{ e.company || '-' }} | {{ e.position || '-' }} | {{ e.event2 || '-' }} | {{ e.event3 }}待结果 | {{ e.date || '-' }} | {{ clip(e.remark, 25) || '-' }} | |
| 暂无面试事件{{ eQuery.student_id ? '' : ',点击右上角新建' }} | |||||||
{{ eventForm.id ? '编辑面试事件' : '新建面试事件' }}
{{ eventForm.error }}
套餐:{{ packageStatus.package.name }}
类型:{{ packageStatus.package.type === '课量限制' ? '课量' : '时长' }}
已用:{{ packageStatus.used }} / {{ packageStatus.package.limit_value }}
剩余:{{ packageStatus.left }}
⚠ {{ packageStatus.warning }}
| 学员 | 节次 | 课程时间 | 内容 | 辅导专家 | 状态 | 结算 | 操作 |
|---|---|---|---|---|---|---|---|
| {{ l.student_name }} | {{ l.lesson_no ?? '-' }} | {{ fmtTime(l.lesson_time) }} | {{ l.coach_name || '-' }} | {{ l.status }} ⇄ {{ l.status }} | {{ l.settled==='已结算' ? '已结算' : '未结算' }} ⇄ {{ l.settled==='已结算' ? '已结算' : '未结算' }} | ||
| 暂无上课记录 | |||||||
| ID | 课程名 | 类型 | 限制值 | 学员数 | 完课数 | 描述 | 操作 |
|---|---|---|---|---|---|---|---|
| {{ p.id }} | {{ p.name }} | {{ p.type }} | {{ p.type==='课量限制' ? p.limit_value + ' 节' : p.limit_value + ' 天' }} | {{ p.student_count ?? 0 }} | {{ p.completed_lessons ?? 0 }} | {{ clip(p.description, 25) || '-' }} | |
| 暂无套餐 | |||||||
{{ pkgForm.id ? '编辑套餐' : '新建套餐' }}
{{ pkgForm.error }}
{{ stats.students_total }}
已签约学员
{{ stats.reserved }}
预约中课时
{{ stats.completed }}
已完成课时
{{ stats.pending_settle }}
待结算课时
| {{ d }} |
|---|
|
{{ Number(day.slice(8)) }}
{{ item.student_name }}·第{{ item.lesson_no }}节·{{ item.coach_name || '-' }}
|
| 时间 | 用户 | 角色 | 操作 | 路径 | 详情 | 状态 | IP |
|---|---|---|---|---|---|---|---|
| {{ l.created_at }} | {{ l.username || '-' }}{{ l.impersonated_by ? '(由' + l.impersonated_by + '登录)' : '' }} | {{ roleName(l.role) }} | {{ l.method }} | {{ l.path }} | {{ clip(l.detail, 50) || '-' }} | {{ l.status_code }} | {{ l.ip }} |
| 暂无审计记录 | |||||||
共 {{ aTotal }} 条 · 第 {{ aQuery.page }}/{{ aPages }} 页
{{ certInfo.message || '未找到证书' }}
服务器部署后请先安装 certbot 并申请证书:
sudo apt install certbot && sudo certbot certonly --nginx -d {{ certInfo.domain || 'skylucid.org' }}
服务器部署后请先安装 certbot 并申请证书:
sudo apt install certbot && sudo certbot certonly --nginx -d {{ certInfo.domain || 'skylucid.org' }}
| 域名 (SAN) | {{ (certInfo.sans || []).join('、') || certInfo.domain }} |
|---|---|
| 签发者 | {{ certInfo.issuer }} |
| 颁发时间 | {{ fmtDT(certInfo.not_before) }} |
| 到期时间 | {{ fmtDT(certInfo.not_after) }} |
| 剩余天数 | {{ certInfo.days_left }} 天 ⚠ 即将到期,请尽快续期 |
| 证书文件 | {{ certInfo.cert_file }} |
自动续期:由系统 certbot.timer 负责(每 12 小时检查,到期前 30 天自动续期),本页按钮为手动触发。
续期命令通过 sudoers 白名单执行(仅允许 certbot renew,不开放全部 sudo 权限)。
续期命令通过 sudoers 白名单执行(仅允许 certbot renew,不开放全部 sudo 权限)。
备份保存在服务器本地目录(data/backups/)
| 文件名 | 大小 | 创建时间 | 操作 |
|---|---|---|---|
| {{ b.filename }} | {{ fmtSize(b.size) }} | {{ b.created_at }} | |
| 暂无备份,点击右上角「立即备份」 | |||