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
@@ -1171,6 +1171,60 @@ class AppLocalizationsZh extends AppLocalizations {
@override
String get settingsDoNotSellDisabled => '已开启';
@override
String get settingsFeedbackTitle => '意见反馈';
@override
String get feedbackTitle => '意见反馈';
@override
String get feedbackTypeLabel => '反馈类型';
@override
String get feedbackTypeBug => '问题反馈';
@override
String get feedbackTypeSuggestion => '功能建议';
@override
String get feedbackTypeOther => '其他';
@override
String get feedbackContentLabel => '反馈内容';
@override
String get feedbackContentHint => '请详细描述您的问题或建议...';
@override
String get feedbackImagesLabel => '添加截图(最多3张)';
@override
String get feedbackAnonymousLabel => '不上传我的个人信息';
@override
String get feedbackAnonymousHint => '勾选后将不采集您的用户ID,仅采集设备信息用于问题排查';
@override
String get feedbackSubmit => '提交反馈';
@override
String get feedbackSubmitting => '提交中...';
@override
String get feedbackSuccess => '感谢您的反馈,我们会尽快处理';
@override
String get feedbackContentRequired => '请输入反馈内容';
@override
String get feedbackContentTooLong => '反馈内容不能超过500字';
@override
String get feedbackTooManyImages => '最多只能上传3张图片';
@override
String get feedbackImageTooLarge => '图片大小不能超过5MB';
}
/// The translations for Chinese, using the Han script (`zh_Hant`).
@@ -2096,4 +2150,58 @@ class AppLocalizationsZhHant extends AppLocalizationsZh {
@override
String get settingsDoNotSellDisabled => '已開啟';
@override
String get settingsFeedbackTitle => '意見回饋';
@override
String get feedbackTitle => '意見回饋';
@override
String get feedbackTypeLabel => '回饋類型';
@override
String get feedbackTypeBug => '問題回饋';
@override
String get feedbackTypeSuggestion => '功能建議';
@override
String get feedbackTypeOther => '其他';
@override
String get feedbackContentLabel => '回饋內容';
@override
String get feedbackContentHint => '請詳細描述您的問題或建議...';
@override
String get feedbackImagesLabel => '添加截圖(最多3張)';
@override
String get feedbackAnonymousLabel => '不上傳我的個人信息';
@override
String get feedbackAnonymousHint => '勾選後將不採集您的用戶ID,僅採集設備信息用於問題排查';
@override
String get feedbackSubmit => '提交回饋';
@override
String get feedbackSubmitting => '提交中...';
@override
String get feedbackSuccess => '感謝您的回饋,我們會盡快處理';
@override
String get feedbackContentRequired => '請輸入回饋內容';
@override
String get feedbackContentTooLong => '回饋內容不能超過500字';
@override
String get feedbackTooManyImages => '最多只能上傳3張圖片';
@override
String get feedbackImageTooLarge => '圖片大小不能超過5MB';
}