167 lines
7.6 KiB
Plaintext
167 lines
7.6 KiB
Plaintext
<view class="page-shell">
|
||
<text class="eyebrow">个人档案</text>
|
||
<view class="page-heading">
|
||
<text class="heading-icon">◎</text>
|
||
<text class="page-title">学生档案</text>
|
||
</view>
|
||
<text class="page-subtitle">管理学生默认信息,用于快速生成课堂反馈</text>
|
||
|
||
<view wx:if="{{errorMessage}}" class="status-banner">
|
||
<text>{{errorMessage}}</text>
|
||
<text class="status-action" bindtap="retryLoad">重试</text>
|
||
</view>
|
||
|
||
<view class="search-row">
|
||
<view class="search-box">
|
||
<text class="search-icon">⌕</text>
|
||
<input
|
||
class="search-input"
|
||
placeholder="搜索学生姓名、年级、学科或称呼"
|
||
placeholder-class="search-placeholder"
|
||
value="{{query}}"
|
||
bindinput="onSearch"
|
||
confirm-type="search"
|
||
/>
|
||
</view>
|
||
<button class="filter-button" bindtap="toggleFilter" aria-label="筛选学生档案">
|
||
<text>▽</text>
|
||
</button>
|
||
</view>
|
||
|
||
<view wx:if="{{filterVisible}}" class="filter-panel surface">
|
||
<view class="filter-header">
|
||
<text class="filter-title">筛选学生档案</text>
|
||
<text class="filter-clear" bindtap="clearFilters">清除</text>
|
||
</view>
|
||
<text class="filter-label">年级</text>
|
||
<view class="filter-options">
|
||
<text class="filter-chip {{!filterGrade ? 'filter-chip-active' : ''}}" data-type="grade" data-value="all" bindtap="selectFilter">全部</text>
|
||
<text wx:for="{{grades}}" wx:key="*this" class="filter-chip {{filterGrade === item ? 'filter-chip-active' : ''}}" data-type="grade" data-value="{{item}}" bindtap="selectFilter">{{item}}</text>
|
||
</view>
|
||
<text class="filter-label">学科</text>
|
||
<view class="filter-options">
|
||
<text class="filter-chip {{!filterSubject ? 'filter-chip-active' : ''}}" data-type="subject" data-value="all" bindtap="selectFilter">全部</text>
|
||
<text wx:for="{{subjects}}" wx:key="*this" class="filter-chip {{filterSubject === item ? 'filter-chip-active' : ''}}" data-type="subject" data-value="{{item}}" bindtap="selectFilter">{{item}}</text>
|
||
</view>
|
||
</view>
|
||
|
||
<view class="archive-toolbar surface">
|
||
<view class="toolbar-copy">
|
||
<view class="toolbar-title-row">
|
||
<text class="toolbar-icon">▣</text>
|
||
<text class="toolbar-title">档案卡片</text>
|
||
</view>
|
||
<text class="toolbar-description">点击卡片展开最近三条反馈</text>
|
||
<text class="toolbar-updated">上次更新:{{lastUpdatedText}}</text>
|
||
</view>
|
||
<view class="toolbar-actions">
|
||
<button class="refresh-button" loading="{{loading}}" disabled="{{loading}}" bindtap="onRefresh" aria-label="刷新学生档案">↻</button>
|
||
<button class="new-student-button" bindtap="openCreate"><text class="new-student-icon">+</text>新增学生</button>
|
||
</view>
|
||
</view>
|
||
|
||
<view wx:if="{{loading && profiles.length === 0}}" class="loading-state">正在从服务端读取学生档案...</view>
|
||
|
||
<view wx:elif="{{profiles.length === 0}}" class="empty-state">
|
||
<text class="empty-icon">◎</text>
|
||
<text class="empty-title">暂无学生档案</text>
|
||
<text class="empty-description">请先创建学生档案</text>
|
||
<button class="create-empty-button primary-button" bindtap="openCreate"><text class="button-icon">+</text>创建学生档案</button>
|
||
</view>
|
||
|
||
<view wx:elif="{{filteredProfiles.length === 0}}" class="empty-state compact-empty">
|
||
<text class="empty-icon">⌕</text>
|
||
<text class="empty-title">没有匹配的档案</text>
|
||
<text class="empty-description">试试清除关键词或筛选条件</text>
|
||
<button class="clear-search-button secondary-button" bindtap="clearFilters">清除搜索与筛选</button>
|
||
</view>
|
||
|
||
<view wx:else class="profile-list">
|
||
<view wx:for="{{filteredProfiles}}" wx:key="id" class="profile-card surface">
|
||
<view class="profile-card-top">
|
||
<view>
|
||
<text class="profile-name">{{item.name}}</text>
|
||
<text class="profile-guardian">{{item.guardianTitle}}</text>
|
||
</view>
|
||
<button class="delete-button" loading="{{deletingId === item.id}}" disabled="{{deletingId === item.id}}" data-id="{{item.id}}" catchtap="deleteProfile" aria-label="删除学生档案">删除</button>
|
||
</view>
|
||
<view class="profile-tags">
|
||
<text class="profile-tag">{{item.grade}}</text>
|
||
<text class="profile-tag">{{item.subject}}</text>
|
||
<text class="profile-tag">{{item.academicYear}}{{item.term}}</text>
|
||
</view>
|
||
<view class="profile-time-row">
|
||
<text class="profile-time-label">上课时间</text>
|
||
<text class="profile-time-value">{{item.startTime}} - {{item.endTime}}</text>
|
||
</view>
|
||
</view>
|
||
</view>
|
||
</view>
|
||
|
||
<view wx:if="{{sheetVisible}}" class="sheet-mask" bindtap="closeCreate">
|
||
<view class="create-sheet" catchtap="noop">
|
||
<view class="sheet-top">
|
||
<view>
|
||
<view class="sheet-title-row">
|
||
<text class="sheet-title-icon">▣</text>
|
||
<text class="sheet-title">新增学生档案</text>
|
||
</view>
|
||
<text class="sheet-subtitle">保存后会同步到学生档案列表</text>
|
||
</view>
|
||
<text class="defaults-link" bindtap="goDefaults">设置预设项 ›</text>
|
||
</view>
|
||
|
||
<scroll-view class="sheet-scroll" scroll-y="true">
|
||
<view class="sheet-form">
|
||
<view class="form-field full-field">
|
||
<text class="form-label">学生姓名</text>
|
||
<input class="form-input" placeholder="请输入学生姓名" value="{{draft.name}}" bindinput="onNameInput" maxlength="20" />
|
||
</view>
|
||
|
||
<view class="form-grid">
|
||
<picker class="form-field" mode="selector" range="{{grades}}" bindchange="onGradeChange">
|
||
<text class="form-label">年级</text>
|
||
<text class="form-value">{{draft.grade}}</text>
|
||
</picker>
|
||
<picker class="form-field" mode="selector" range="{{subjects}}" bindchange="onSubjectChange">
|
||
<text class="form-label">学科</text>
|
||
<text class="form-value">{{draft.subject}}</text>
|
||
</picker>
|
||
</view>
|
||
|
||
<view class="form-grid">
|
||
<picker class="form-field" mode="selector" range="{{years}}" bindchange="onYearChange">
|
||
<text class="form-label">日期年份</text>
|
||
<text class="form-value">{{draft.academicYear}}</text>
|
||
</picker>
|
||
<picker class="form-field" mode="selector" range="{{terms}}" bindchange="onTermChange">
|
||
<text class="form-label">日期</text>
|
||
<text class="form-value">{{draft.term}}</text>
|
||
</picker>
|
||
</view>
|
||
|
||
<view class="form-field full-field guardian-field">
|
||
<text class="form-label">默认家长称呼</text>
|
||
<input class="form-input" placeholder="默认:学生姓名 + 妈妈" value="{{draft.guardianTitle}}" bindinput="onGuardianInput" maxlength="24" />
|
||
</view>
|
||
|
||
<view class="form-grid bottom-grid">
|
||
<picker class="form-field" mode="time" value="{{draft.startTime}}" bindchange="onStartTimeChange">
|
||
<text class="form-label">开始时间</text>
|
||
<text class="form-value">{{draft.startTime}}</text>
|
||
</picker>
|
||
<picker class="form-field" mode="time" value="{{draft.endTime}}" bindchange="onEndTimeChange">
|
||
<text class="form-label">结束时间</text>
|
||
<text class="form-value">{{draft.endTime}}</text>
|
||
</picker>
|
||
</view>
|
||
</view>
|
||
</scroll-view>
|
||
|
||
<view class="sheet-footer">
|
||
<button class="sheet-cancel secondary-button" bindtap="closeCreate">取消</button>
|
||
<button class="sheet-save primary-button" loading="{{saving}}" disabled="{{saving}}" bindtap="saveStudent">保存</button>
|
||
</view>
|
||
</view>
|
||
</view>
|