Files
teaching-feedback-assistant/pages/records/index.wxml
shay7sev a875fe9f63 feat(observability): add structured application logging
Emit correlated JSON logs from the API and FunASR services, propagate request IDs to the client, and configure bounded opt-in Docker logging.

Document the host-wide Grafana/Loki query workflow and keep observability deployment ownership outside the application repository.
2026-07-22 13:52:40 +08:00

46 lines
2.0 KiB
Plaintext

<view class="page-shell records-page">
<text class="eyebrow">课堂反馈</text>
<view class="page-heading">
<text class="page-title">反馈记录</text>
</view>
<text class="page-subtitle">按学生查阅已保存的课堂反馈。</text>
<view wx:if="{{errorMessage}}" class="status-banner">
<view class="status-copy">
<text>{{errorMessage}}</text>
<view wx:if="{{errorRequestId}}" class="status-request-id">
<text>请求编号:{{errorRequestId}}</text>
<text class="status-action" bindtap="copyRequestId">复制</text>
</view>
</view>
<text class="status-action" bindtap="retryLoad">重试</text>
</view>
<picker class="records-filter surface" mode="selector" range="{{profileOptions}}" value="{{selectedProfileIndex}}" disabled="{{loading}}" bindchange="onProfileChange">
<text class="filter-label">筛选学生</text>
<text class="filter-value">{{profileOptions[selectedProfileIndex]}}</text>
</picker>
<view wx:if="{{loading && records.length === 0}}" class="loading-state">正在读取反馈记录...</view>
<view wx:elif="{{records.length === 0}}" class="records-empty surface">
<text class="empty-icon">◴</text>
<text class="empty-title">暂无反馈记录</text>
<text class="helper-text">保存课堂反馈后,记录会显示在这里。</text>
<button class="primary-button empty-action" bindtap="goFeedback">填写反馈</button>
</view>
<view wx:else class="record-list">
<view wx:for="{{records}}" wx:key="id" class="record-card surface">
<view class="record-top">
<view>
<text class="record-profile">{{item.profileName}}</text>
<text class="record-date">{{item.feedbackDate}}</text>
</view>
<button class="delete-button" loading="{{deletingId === item.id}}" disabled="{{deletingId === item.id}}" data-id="{{item.id}}" bindtap="deleteRecord">删除</button>
</view>
<text class="record-content">{{item.content}}</text>
</view>
</view>
</view>