fix(feedback): refine summary and error states
This commit is contained in:
@@ -5,15 +5,17 @@
|
|||||||
</view>
|
</view>
|
||||||
<text class="page-subtitle">填写课堂表现并保存到教学反馈记录。</text>
|
<text class="page-subtitle">填写课堂表现并保存到教学反馈记录。</text>
|
||||||
|
|
||||||
<view wx:if="{{errorMessage}}" class="status-banner">
|
<view wx:if="{{errorMessage}}" class="status-banner feedback-error-banner">
|
||||||
<view class="status-copy">
|
<view class="status-copy">
|
||||||
<text>{{errorMessage}}</text>
|
<text class="feedback-error-message">{{errorMessage}}</text>
|
||||||
<view wx:if="{{errorRequestId}}" class="status-request-id">
|
</view>
|
||||||
<text>请求编号:{{errorRequestId}}</text>
|
<view class="feedback-error-footer">
|
||||||
<text class="status-action" bindtap="copyRequestId">复制</text>
|
<view wx:if="{{errorRequestId}}" class="feedback-error-reference">
|
||||||
</view>
|
<text>问题编号:{{errorRequestId}}</text>
|
||||||
|
<button class="feedback-error-copy" bindtap="copyRequestId">复制编号</button>
|
||||||
|
</view>
|
||||||
|
<button class="feedback-error-retry" bindtap="retryLoad">重试</button>
|
||||||
</view>
|
</view>
|
||||||
<text class="status-action" bindtap="retryLoad">重试</text>
|
|
||||||
</view>
|
</view>
|
||||||
|
|
||||||
<view class="feedback-form surface">
|
<view class="feedback-form surface">
|
||||||
|
|||||||
@@ -7,6 +7,76 @@
|
|||||||
padding: 0;
|
padding: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.feedback-error-banner {
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: stretch;
|
||||||
|
gap: 14rpx;
|
||||||
|
}
|
||||||
|
|
||||||
|
.feedback-error-message {
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
|
||||||
|
.feedback-error-footer,
|
||||||
|
.feedback-error-reference {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.feedback-error-footer {
|
||||||
|
justify-content: flex-end;
|
||||||
|
gap: 18rpx;
|
||||||
|
}
|
||||||
|
|
||||||
|
.feedback-error-reference {
|
||||||
|
flex: 1;
|
||||||
|
min-width: 0;
|
||||||
|
gap: 12rpx;
|
||||||
|
color: #6e6e73;
|
||||||
|
font-size: 21rpx;
|
||||||
|
}
|
||||||
|
|
||||||
|
.feedback-error-reference > text {
|
||||||
|
min-width: 0;
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
.feedback-error-copy,
|
||||||
|
.feedback-error-retry {
|
||||||
|
display: flex;
|
||||||
|
flex: none;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
height: 56rpx;
|
||||||
|
margin: 0;
|
||||||
|
border: 0;
|
||||||
|
border-radius: 8rpx;
|
||||||
|
font-size: 23rpx;
|
||||||
|
line-height: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.feedback-error-copy {
|
||||||
|
padding: 0;
|
||||||
|
background: transparent;
|
||||||
|
color: #6e6e73;
|
||||||
|
font-weight: 500;
|
||||||
|
}
|
||||||
|
|
||||||
|
.feedback-error-retry {
|
||||||
|
min-width: 104rpx;
|
||||||
|
padding: 0 22rpx;
|
||||||
|
background: #007aff;
|
||||||
|
color: #ffffff;
|
||||||
|
font-weight: 600;
|
||||||
|
}
|
||||||
|
|
||||||
|
.feedback-error-copy::after,
|
||||||
|
.feedback-error-retry::after {
|
||||||
|
border: 0;
|
||||||
|
}
|
||||||
|
|
||||||
.feedback-field,
|
.feedback-field,
|
||||||
.content-field {
|
.content-field {
|
||||||
padding: 24rpx;
|
padding: 24rpx;
|
||||||
@@ -323,14 +393,18 @@
|
|||||||
|
|
||||||
.voice-summary-button,
|
.voice-summary-button,
|
||||||
.voice-summary-apply-button {
|
.voice-summary-apply-button {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
height: 72rpx;
|
height: 72rpx;
|
||||||
margin: 0;
|
margin: 0;
|
||||||
|
padding: 0 20rpx;
|
||||||
border: 0;
|
border: 0;
|
||||||
border-radius: 8rpx;
|
border-radius: 8rpx;
|
||||||
font-size: 25rpx;
|
font-size: 25rpx;
|
||||||
font-weight: 600;
|
font-weight: 600;
|
||||||
line-height: 72rpx;
|
line-height: 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
.voice-summary-button {
|
.voice-summary-button {
|
||||||
|
|||||||
@@ -92,10 +92,11 @@ impl IntoResponse for ApiError {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl From<sqlx::Error> for ApiError {
|
impl From<sqlx::Error> for ApiError {
|
||||||
fn from(_: sqlx::Error) -> Self {
|
fn from(error: sqlx::Error) -> Self {
|
||||||
tracing::error!(
|
tracing::error!(
|
||||||
event = "database_query_failed",
|
event = "database_query_failed",
|
||||||
error_class = "database_query_failed",
|
error_class = "database_query_failed",
|
||||||
|
error = %error,
|
||||||
"database query failed"
|
"database query failed"
|
||||||
);
|
);
|
||||||
Self::Internal
|
Self::Internal
|
||||||
|
|||||||
@@ -192,6 +192,10 @@ export function getApiErrorMessage(error: unknown): string {
|
|||||||
if (error.statusCode === 401) return '登录状态已失效,请重试'
|
if (error.statusCode === 401) return '登录状态已失效,请重试'
|
||||||
if (error.statusCode === 404) return '请求的数据不存在或无权访问'
|
if (error.statusCode === 404) return '请求的数据不存在或无权访问'
|
||||||
if (error.statusCode === 503 && error.message.includes('database')) return '后端尚未配置数据库连接'
|
if (error.statusCode === 503 && error.message.includes('database')) return '后端尚未配置数据库连接'
|
||||||
|
if (error.statusCode && error.statusCode >= 500) return '服务暂时无法完成操作,请稍后重试'
|
||||||
|
if (error.message.toLowerCase() === 'internal server error') {
|
||||||
|
return '服务暂时无法完成操作,请稍后重试'
|
||||||
|
}
|
||||||
return error.message
|
return error.message
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user