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 `
${brand()}
`; } 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) : '
暂无开放考试
'}

NOTICE BOARD

通知公告

招生录取公示已纳入通知公告,可按类别统一查询。

${notices.slice(1, 5).map(renderNoticeRow).join('') || '
暂无更多通知
'}

OPEN EXAMINATIONS

考试报名

登录后选择考试,并按实际需要勾选报考科目。

${exams.map(renderPublicExam).join('') || '
当前没有已发布的考试
'}

SERVICE FLOW

报名号是唯一账户

报名号不会随考试改变,每场考试只新增一条报名记录。

${[['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 `

本公示由生源校完成全部考生资格确认后自动生成。

${document.rows.map(row => ``).join('')}
报名号姓名指标分配资格特长类型
${h(row.registrationNumber)}${h(row.name)}${row.eligible ? '有' : '无'}${h(row.specialtyLabel || '普通生')}
`; if (document.documentType === 'admission') return `

报名号、姓名、考生总成绩与录取学校公开透明;证件号和联系方式不在本页展示。

${document.rows.map(row => ``).join('')}
报名号姓名总成绩录取学校录取类别
${h(row.registrationNumber)}${h(row.name)}${h(row.totalScore)}${h(row.admittedSchool)}${h(row.categoryName)}
`; return `

录取分数线为对应学校、招生类别最终录取考生的最低总成绩。

${document.rows.map(row => ``).join('')}
招生学校招生类别计划数录取数最高分录取分数线
${h(row.schoolName)}${h(row.categoryName)}${h(row.planQuota)}${h(row.admittedCount)}${h(row.highestScore)}${h(row.cutoffScore)}
`; } 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)}
${h(selected.category)} · ${h(selected.subtype)}

${h(selected.title)}

${formatDate(selected.publishedAt, true)}${selected.author ? ` · ${h(selected.author)}` : ''}

${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)}份公开文件
${h(category)}第 ${h(page)} / ${h(totalPages)} 页
共 ${h(filtered.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 }; }