export function createPublicViews(context) {
const {
state,
app,
h,
formatDate,
dateRange,
badge,
money,
passPolicyText,
statusLabels,
icons,
api,
renderError,
emptyState
} = context;
function brand() {
return `衡准EXAM SERVICE`;
}
function publicHeader() {
return ``;
}
function renderHome() {
app.classList.remove('admin-readable');
const { notices, exams, stats, organization } = state.publicData;
const siteCopy = state.publicData.siteCopy || {};
const featured = exams.find(exam => exam.registrationState === 'open') || exams[0];
const topNotice = notices[0];
app.innerHTML = `${publicHeader()}
最新
${h(siteCopy.heroEyebrow || 'EXAMINATION SERVICE')}
${h(siteCopy.heroTitle || '一个报名号,')}
${h(siteCopy.heroHighlight || '贯穿每一次考试。')}
${h(siteCopy.heroDescription || '')}
${state.user?.role === 'candidate' ? `` : state.publicData.selfRegistrationEnabled ? `` : ``}
${h(stats.candidates || 0)}在册考生
${h(stats.registrations || 0)}报名记录
${h(stats.exams || 0)}开放考试
${featured ? renderHeroTicket(featured) : '
暂无开放考试
'}
${topNotice ? `${h(topNotice.category)}${h(topNotice.title)}
${h(topNotice.summary)}
` : '暂无通知
'}${notices.slice(1, 5).map(renderNoticeRow).join('') || '
暂无更多通知
'}
${exams.map(renderPublicExam).join('') || '
当前没有已发布的考试
'}
报名号不会随考试改变,每场考试只新增一条报名记录。
${[['01','领取报名号','学校创建账户并下发初始密码。'],['02','修改初始密码','首次登录必须设置自己的新密码。'],['03','补全个人信息','填写籍贯、住址、手机、邮箱和班级等资料。'],['04','选择考试科目','资料审核通过后自主选择考试。'],['05','下载准考证与查分','继续使用同一报名号办理后续事项。']].map(item => `
${item[0]}${item[1]}
${item[2]}
`).join('')}
`;
}
function noticeDocuments(data = state.publicAnnouncements) {
const ordinary = (state.publicData.notices || []).map(item => ({ ...item, documentId: item.id, documentType: 'notice', subtype: item.category || '通知公告', publishedAt: item.publishAt }));
const qualifications = (data.qualifications || []).map(item => ({ ...item, documentId: `qualification-${item.id}`, documentType: 'qualification', category: '录取公示', subtype: '指标资格', title: `${item.examName} · ${item.schoolName}指标分配资格公示`, summary: `本次公开 ${item.rows.length} 名考生的指标分配资格及特长类型。` }));
const admissions = (data.admissions || []).map(item => ({ ...item, documentId: `admission-${item.id}`, documentType: 'admission', category: '录取公示', subtype: '录取名单', title: `${item.examName}最终录取名单`, summary: `共 ${item.rows.length} 名考生正式录取,公开报名号、姓名、总成绩和录取学校。` }));
const cutoffs = (data.cutoffs || []).map(item => ({ ...item, documentId: `cutoff-${item.id}`, documentType: 'cutoff', category: '录取公示', subtype: '录取分数线', title: `${item.examName}录取分数线`, summary: `按招生学校和招生类别公布 ${item.rows.length} 条最低录取分数线。` }));
return [...ordinary, ...qualifications, ...admissions, ...cutoffs].sort((left, right) => new Date(right.publishedAt) - new Date(left.publishedAt));
}
function renderDocumentBody(document) {
if (document.documentType === 'notice') return `${document.contentHtml || `${h(document.content || '').replace(/\r?\n/g, '
')}
`}`;
if (document.documentType === 'qualification') return `
本公示由生源校完成全部考生资格确认后自动生成。
`;
if (document.documentType === 'admission') return `报名号、姓名、考生总成绩与录取学校公开透明;证件号和联系方式不在本页展示。
`;
return `录取分数线为对应学校、招生类别最终录取考生的最低总成绩。
`;
}
function renderNoticeCenter(data = state.publicAnnouncements, selectedId = '') {
app.classList.remove('admin-readable');
const documents = noticeDocuments(data);
const selected = documents.find(item => item.documentId === selectedId);
const organization = state.publicData.organization || {};
if (selected) {
app.innerHTML = `${publicHeader()}/${h(selected.subtype)}
${renderDocumentBody(selected)}`;
return;
}
const categories = ['全部', ...new Set(documents.map(item => item.category || '通知公告'))];
const category = categories.includes(state.noticeCategory) ? state.noticeCategory : '全部';
const filtered = category === '全部' ? documents : documents.filter(item => item.category === category);
const pageSize = 8;
const totalPages = Math.max(1, Math.ceil(filtered.length / pageSize));
const page = Math.min(totalPages, Math.max(1, Number(state.noticePage || 1)));
state.noticeCategory = category; state.noticePage = page;
const pageRows = filtered.slice((page - 1) * pageSize, page * pageSize);
app.innerHTML = `${publicHeader()}PUBLIC NOTICE ARCHIVE
通知公告
考试通知、成绩发布与招生录取公示统一归档,按发布时间倒序公开。
${h(documents.length)}份公开文件${pageRows.map(item => `
`).join('') || '
当前分类暂无公开信息
'}
`;
}
function renderHeroTicket(exam) {
const status = exam.registrationState;
return `${badge(status)}${h(exam.code)}UPCOMING EXAM
${h(exam.name)}
- 报名时间
- ${dateRange(exam.registrationStart, exam.registrationEnd)}
- 考试时间
- ${dateRange(exam.examStart, exam.examEnd)}
- 考试地点
- ${h(exam.location)}
${exam.subjects.slice(0, 5).map(subject => `${h(subject.name)}`).join('')}${exam.subjects.length > 5 ? `+${exam.subjects.length - 5}` : ''}
报名人数${h(exam.registrationCount || 0)}
`;
}
function renderNoticeRow(notice) {
return ``;
}
function renderPublicExam(exam) {
return `${h(exam.code)}${badge(exam.registrationState)}${h(exam.name)}
${h(exam.description)}
报名${dateRange(exam.registrationStart, exam.registrationEnd)}考试${dateRange(exam.examStart, exam.examEnd)}总分${h(exam.totalScore)} 分 · ${h(passPolicyText(exam))}
`;
}
function renderAuth(kind) {
app.classList.remove('admin-readable');
const login = kind === 'login';
const selfRegistration = state.publicData.selfRegistrationEnabled;
app.innerHTML = `${brand()}
CANDIDATE SERVICE
${login ? '凭一个号码,' : '自主申请,'}
${login ? '办理每一次考试。' : '领取固定报名号。'}
报名号就是考生账户,不因考试、科目或年度报名而改变。
首次登录顺序修改初始密码 → 补全个人信息 → 等待资料审核。
${login ? 'ACCOUNT LOGIN' : 'CANDIDATE NUMBER'}
${login ? '报名号登录' : '自主申请报名号'}
${login ? '考生填写报名号和密码;管理员继续使用管理账号。' : selfRegistration ? '提交基础学籍范围后,系统生成一个长期使用的报名号。' : '当前未开放自主注册,请联系学校领取报名号和初始密码。'}
${login ? loginForm() : selfRegistration ? registerForm() : '
自主注册已关闭学校管理员会为考生创建账户并下发初始密码。
'}${login && selfRegistration ? `
还没有报名号?
` : !login ? '
已经有报名号?
' : ''}
`;
}
function loginForm() {
return ``;
}
function registerForm() {
const schools = state.publicData.schools || [];
return ``;
}
return { brand, renderHome, renderNoticeCenter, renderAuth };
}