feat(feedback): implement user feedback collection system with email reporting

Backend:
- Add user_feedback table with RLS policy
- Create feedback submission API (multipart/form-data)
- Implement xlsx report generation with embedded images
- Add scheduled email delivery via Feishu SMTP
- Create HTML email templates (daily_report, no_feedback)

Frontend:
- Add feedback screen with type selection and image picker
- Support anonymous submission via skipAuth flag
- Collect device info and app version

Protocol:
- Document feedback API contract and error codes
- Update http-error-codes.md with FEEDBACK_* codes
This commit is contained in:
qzl
2026-04-20 12:49:54 +08:00
parent 913ed26f8d
commit 6a2a9d2c87
46 changed files with 4768 additions and 9 deletions
+108
View File
@@ -2324,6 +2324,114 @@ abstract class AppLocalizations {
/// In zh, this message translates to:
/// **'已开启'**
String get settingsDoNotSellDisabled;
/// No description provided for @settingsFeedbackTitle.
///
/// In zh, this message translates to:
/// **'意见反馈'**
String get settingsFeedbackTitle;
/// No description provided for @feedbackTitle.
///
/// In zh, this message translates to:
/// **'意见反馈'**
String get feedbackTitle;
/// No description provided for @feedbackTypeLabel.
///
/// In zh, this message translates to:
/// **'反馈类型'**
String get feedbackTypeLabel;
/// No description provided for @feedbackTypeBug.
///
/// In zh, this message translates to:
/// **'问题反馈'**
String get feedbackTypeBug;
/// No description provided for @feedbackTypeSuggestion.
///
/// In zh, this message translates to:
/// **'功能建议'**
String get feedbackTypeSuggestion;
/// No description provided for @feedbackTypeOther.
///
/// In zh, this message translates to:
/// **'其他'**
String get feedbackTypeOther;
/// No description provided for @feedbackContentLabel.
///
/// In zh, this message translates to:
/// **'反馈内容'**
String get feedbackContentLabel;
/// No description provided for @feedbackContentHint.
///
/// In zh, this message translates to:
/// **'请详细描述您的问题或建议...'**
String get feedbackContentHint;
/// No description provided for @feedbackImagesLabel.
///
/// In zh, this message translates to:
/// **'添加截图(最多3张)'**
String get feedbackImagesLabel;
/// No description provided for @feedbackAnonymousLabel.
///
/// In zh, this message translates to:
/// **'不上传我的个人信息'**
String get feedbackAnonymousLabel;
/// No description provided for @feedbackAnonymousHint.
///
/// In zh, this message translates to:
/// **'勾选后将不采集您的用户ID,仅采集设备信息用于问题排查'**
String get feedbackAnonymousHint;
/// No description provided for @feedbackSubmit.
///
/// In zh, this message translates to:
/// **'提交反馈'**
String get feedbackSubmit;
/// No description provided for @feedbackSubmitting.
///
/// In zh, this message translates to:
/// **'提交中...'**
String get feedbackSubmitting;
/// No description provided for @feedbackSuccess.
///
/// In zh, this message translates to:
/// **'感谢您的反馈,我们会尽快处理'**
String get feedbackSuccess;
/// No description provided for @feedbackContentRequired.
///
/// In zh, this message translates to:
/// **'请输入反馈内容'**
String get feedbackContentRequired;
/// No description provided for @feedbackContentTooLong.
///
/// In zh, this message translates to:
/// **'反馈内容不能超过500字'**
String get feedbackContentTooLong;
/// No description provided for @feedbackTooManyImages.
///
/// In zh, this message translates to:
/// **'最多只能上传3张图片'**
String get feedbackTooManyImages;
/// No description provided for @feedbackImageTooLarge.
///
/// In zh, this message translates to:
/// **'图片大小不能超过5MB'**
String get feedbackImageTooLarge;
}
class _AppLocalizationsDelegate