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:
@@ -0,0 +1,44 @@
|
||||
import 'package:image_picker/image_picker.dart';
|
||||
|
||||
import '../apis/feedback_api.dart';
|
||||
import '../models/feedback.dart';
|
||||
|
||||
abstract class FeedbackRepository {
|
||||
Future<void> submitFeedback({
|
||||
required FeedbackType type,
|
||||
required String content,
|
||||
required DeviceInfo deviceInfo,
|
||||
required String appVersion,
|
||||
required String osVersion,
|
||||
required List<XFile> images,
|
||||
required bool isAnonymous,
|
||||
});
|
||||
}
|
||||
|
||||
class FeedbackRepositoryImpl implements FeedbackRepository {
|
||||
FeedbackRepositoryImpl({required FeedbackApi feedbackApi})
|
||||
: _feedbackApi = feedbackApi;
|
||||
|
||||
final FeedbackApi _feedbackApi;
|
||||
|
||||
@override
|
||||
Future<void> submitFeedback({
|
||||
required FeedbackType type,
|
||||
required String content,
|
||||
required DeviceInfo deviceInfo,
|
||||
required String appVersion,
|
||||
required String osVersion,
|
||||
required List<XFile> images,
|
||||
required bool isAnonymous,
|
||||
}) {
|
||||
return _feedbackApi.submitFeedback(
|
||||
type: type,
|
||||
content: content,
|
||||
deviceInfo: deviceInfo,
|
||||
appVersion: appVersion,
|
||||
osVersion: osVersion,
|
||||
images: images,
|
||||
isAnonymous: isAnonymous,
|
||||
);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user