소스 검색

add:添加一个举报功能提供给苹果审核

zhoukun 5 달 전
부모
커밋
563bf70b65

BIN
assets/images/icon_news_more.webp


BIN
assets/images/icon_news_report.webp


BIN
assets/images/icon_news_report_agree.webp


BIN
assets/images/icon_news_report_bg.webp


+ 27 - 0
ios/build/XCBuildData/29606b5c766a7bc82970f1cac9879b20.xcbuilddata/build-request.json

@@ -0,0 +1,27 @@
+{
+  "buildCommand" : {
+    "command" : "build",
+    "skipDependencies" : false,
+    "style" : "buildOnly"
+  },
+  "configuredTargets" : [
+
+  ],
+  "continueBuildingAfterErrors" : false,
+  "dependencyScope" : "workspace",
+  "enableIndexBuildArena" : false,
+  "hideShellScriptEnvironment" : false,
+  "parameters" : {
+    "action" : "build",
+    "overrides" : {
+
+    }
+  },
+  "qos" : "utility",
+  "schemeCommand" : "launch",
+  "showNonLoggedProgress" : true,
+  "useDryRun" : false,
+  "useImplicitDependencies" : false,
+  "useLegacyBuildLocations" : false,
+  "useParallelTargets" : true
+}

BIN
ios/build/XCBuildData/29606b5c766a7bc82970f1cac9879b20.xcbuilddata/description.msgpack


+ 1 - 0
ios/build/XCBuildData/29606b5c766a7bc82970f1cac9879b20.xcbuilddata/manifest.json

@@ -0,0 +1 @@
+{"client":{"name":"basic","version":0,"file-system":"device-agnostic","perform-ownership-analysis":"no"},"targets":{"":["<all>"]},"commands":{"<all>":{"tool":"phony","inputs":["<WorkspaceHeaderMapVFSFilesWritten>"],"outputs":["<all>"]},"P0:::Gate WorkspaceHeaderMapVFSFilesWritten":{"tool":"phony","inputs":[],"outputs":["<WorkspaceHeaderMapVFSFilesWritten>"]}}}

+ 1 - 0
ios/build/XCBuildData/29606b5c766a7bc82970f1cac9879b20.xcbuilddata/target-graph.txt

@@ -0,0 +1 @@
+Target dependency graph (0 target)

BIN
ios/build/XCBuildData/29606b5c766a7bc82970f1cac9879b20.xcbuilddata/task-store.msgpack


+ 2 - 0
lib/di/get_it.config.dart

@@ -32,6 +32,7 @@ import '../module/main/main_controller.dart' as _i731;
 import '../module/member/member_controller.dart' as _i269;
 import '../module/mine/mine_controller.dart' as _i732;
 import '../module/news/news_controller.dart' as _i489;
+import '../module/news/news_report/news_report_controller.dart' as _i779;
 import '../module/news/pending_list/news_pending_list_controller.dart' as _i433;
 import '../module/permission/permission_setting_controller.dart' as _i108;
 import '../module/splash/splash_controller.dart' as _i973;
@@ -64,6 +65,7 @@ extension GetItInjectableX on _i174.GetIt {
     gh.factory<_i923.BrowserController>(() => _i923.BrowserController());
     gh.factory<_i108.PermissionSettingController>(
         () => _i108.PermissionSettingController());
+    gh.factory<_i779.NewsReportController>(() => _i779.NewsReportController());
     gh.singleton<_i361.Dio>(() => networkModule.createDefaultDio());
     gh.lazySingleton<_i220.AtmobLocationClient>(
         () => _i220.AtmobLocationClient());

+ 33 - 0
lib/module/news/news_controller.dart

@@ -1,14 +1,18 @@
 import 'package:flutter/cupertino.dart';
+import 'package:flutter_screenutil/flutter_screenutil.dart';
 import 'package:get/get.dart';
 import 'package:injectable/injectable.dart';
 import 'package:location/base/base_controller.dart';
 import 'package:location/data/repositories/message_repository.dart';
 import 'package:location/handler/error_handler.dart';
 import 'package:location/module/news/pending_list/news_pending_list_page.dart';
+import 'package:location/resource/assets.gen.dart';
+import 'package:location/utils/common_expand.dart';
 import 'package:url_launcher/url_launcher.dart';
 
 import '../../data/bean/message_info.dart';
 import '../../data/bean/request_friend_info.dart';
+import 'news_report/news_report_page.dart';
 
 @injectable
 class NewsController extends BaseController {
@@ -101,4 +105,33 @@ class NewsController extends BaseController {
   void onMessageWaitingClick() {
     NewsPendingListPage.start();
   }
+
+  ///举报事件
+  void onReportEventClick() {
+    showCupertinoModalPopup(
+      context: Get.context!,
+      builder: (context) => CupertinoActionSheet(
+        actions: [
+          CupertinoActionSheetAction(
+            child: Row(
+              children: [
+                SizedBox(width: 18.w,),
+                Assets.images.iconNewsReport.image(width:20.w,height: 20.w),
+                SizedBox(width: 6.w,),
+                Text(
+                  '举报昵称',
+                  style: TextStyle(
+                      fontSize: 13.sp, color: "#333333".color, fontWeight: FontWeight.w400),
+                ),
+              ],
+            ),
+              onPressed: () {
+                Navigator.pop(context);
+                NewsReportPage.start();
+              }
+          ),
+        ],
+      ),
+    );
+  }
 }

+ 22 - 2
lib/module/news/news_list_item.dart

@@ -1,4 +1,5 @@
 import 'package:flutter/cupertino.dart';
+import 'package:flutter/material.dart';
 import 'package:flutter_screenutil/flutter_screenutil.dart';
 import 'package:location/data/bean/message_info.dart';
 import 'package:location/utils/common_expand.dart';
@@ -10,13 +11,14 @@ import '../../utils/date_util.dart';
 
 typedef MessageFunCallback = void Function(MessageInfo info);
 
-Widget buildMessageInfoItem(MessageInfo item, MessageFunCallback callback) {
+Widget buildMessageInfoItem(MessageInfo item, VoidCallback onReportEvent,MessageFunCallback callback) {
   return buildMessageItem(Assets.images.iconDefaultFriendAvatar.provider(),
       title: item.senderPhone ?? '',
       content: getMessageContentTxt(item.type),
       contentTextStyle: getMessageContentTextStyle(item.type),
       createTime: item.createTime,
       bgGradient: getMessageBgGradient(item.type),
+      onReportEvent: onReportEvent,
       statusWidget: getMessageStatusWidget(item.type, funClick: () {
         callback(item);
       }));
@@ -110,6 +112,7 @@ Widget buildMessageItem(ImageProvider avatar,
     required TextStyle contentTextStyle,
     required int createTime,
     required Widget statusWidget,
+      VoidCallback? onReportEvent,
     Gradient? bgGradient}) {
   return Container(
     decoration: BoxDecoration(
@@ -162,7 +165,24 @@ Widget buildMessageItem(ImageProvider avatar,
                   SizedBox(width: 16.w),
                   statusWidget
                 ],
-              )
+              ),
+              Visibility(
+                visible: onReportEvent == null ? false : true,
+                  child: Column(
+                children: [
+                  SizedBox(height: 7.w),
+                  Container(
+                    alignment: Alignment.centerRight,
+                    //color: Colors.orange,
+                    child: GestureDetector(
+                      onTap: onReportEvent,
+                      child: Container(
+                        child: Assets.images.iconNewsMore.image(width: 15.w,height: 15.w),
+                      ),
+                    ),
+                  )
+                ],
+              ))
             ],
           ))
         ],

+ 4 - 1
lib/module/news/news_page.dart

@@ -138,6 +138,7 @@ class NewsPage extends BasePage<NewsController> {
             contentTextStyle:
                 TextStyle(fontSize: 12.sp, color: ColorName.black60),
             createTime: controller.latestFriendRequest?.createTime ?? 0,
+            onReportEvent: controller.onReportEventClick,
             statusWidget: Container(
               height: 16.w,
               constraints: BoxConstraints(
@@ -162,7 +163,9 @@ class NewsPage extends BasePage<NewsController> {
   Widget buildNewsItem(BuildContext context, int index) {
     final item = controller.messageList[index];
     return buildMessageInfoItem(
-        item, (info) => controller.onMessageFunClick(info));
+        item,
+        () => controller.onReportEventClick(),
+            (info) => controller.onMessageFunClick(info));
   }
 
   Widget buildNoMessageView() {

+ 77 - 0
lib/module/news/news_report/news_report_controller.dart

@@ -0,0 +1,77 @@
+
+
+import 'package:flutter/cupertino.dart';
+import 'package:get/get.dart';
+import 'package:get/get_core/src/get_main.dart';
+import 'package:injectable/injectable.dart';
+import 'package:location/dialog/loading_dialog.dart';
+
+import '../../../base/base_controller.dart';
+import 'news_report_dialog.dart' show NewsReportDialog;
+
+@injectable
+class NewsReportController extends BaseController {
+
+
+  ///用户的基本信息
+  late TextEditingController reportContetnController;
+  late String reportContentString;
+
+  ///用户的基本信息
+  late TextEditingController reportTitleContetnController;
+  late String reportTitleString;
+
+
+  RxBool submitBuEnble = RxBool(false);
+
+  @override
+  void onInit() {
+    // TODO: implement onInit
+    super.onInit();
+    reportContetnController = TextEditingController(text:"");
+    reportContentString = "";
+    reportTitleContetnController = TextEditingController(text:"用户昵称有违规现象");
+    reportTitleString = "用户昵称有违规现象";
+  }
+
+  @override
+  void onReady() {
+    super.onReady();
+  }
+
+
+  void back() {
+    Get.back();
+  }
+
+
+  void inputContentText(String inpustr) {
+    reportContentString = inpustr;
+    onTextInputChange();
+  }
+
+  void inputTitleText(String inpustr) {
+    reportTitleString = inpustr;
+    onTextInputChange();
+  }
+
+
+  void onTextInputChange() {
+    print('sfdsdffdfdfd: ${reportTitleString.length}');
+    if (reportContentString.length > 3 && reportContentString.length < 500 && reportTitleString.length > 0) {
+       submitBuEnble.value = true;
+     } else {
+       submitBuEnble.value = false;
+     }
+  }
+
+  void onSubmti() {
+    FocusManager.instance.primaryFocus?.unfocus();
+    CustomLoadingDialog.show();
+    Future.delayed(Duration(seconds: 2), () {
+      CustomLoadingDialog.hide();
+      NewsReportDialog.show();
+    });
+  }
+
+}

+ 106 - 0
lib/module/news/news_report/news_report_dialog.dart

@@ -0,0 +1,106 @@
+import 'package:flutter/cupertino.dart';
+import 'package:flutter/material.dart';
+import 'package:flutter_screenutil/flutter_screenutil.dart';
+import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
+import 'package:location/resource/string.gen.dart';
+import 'package:location/utils/common_expand.dart';
+
+import '../../../resource/assets.gen.dart';
+import '../../../resource/colors.gen.dart';
+
+class NewsReportDialog {
+  static const String _tag = 'AccountReplaceDialog';
+
+  static void show() {
+    SmartDialog.show(
+        builder: (_) => _NewsReportDialogView(),
+        tag: _tag,
+        clickMaskDismiss: false);
+  }
+
+  static void dismiss() {
+    SmartDialog.dismiss(tag: _tag);
+  }
+}
+
+class _NewsReportDialogView extends StatelessWidget {
+  @override
+  Widget build(BuildContext context) {
+    return Container(
+      width: 274.w,
+      decoration: BoxDecoration(
+          borderRadius: BorderRadius.circular(16.r),
+          border: Border.all(
+            color: Colors.white,
+            width: 2.w,
+          ),
+          gradient: LinearGradient(
+              begin: Alignment.topCenter,
+              end: Alignment.bottomCenter,
+              colors: [
+                '#E4E4FF'.color,
+                '#FFFFFF'.color,
+              ])),
+      child: Stack(
+        alignment: Alignment.center,
+        children: [
+          // Positioned(
+          //     top: 16.w,
+          //     right: 16.w,
+          //     child: GestureDetector(
+          //       onTap: onCloseClick,
+          //       child: Assets.images.iconAgreementClose
+          //           .image(width: 20.w, height: 20.w),
+          //     )),
+          buildAccountReplaceContent(),
+        ],
+      ),
+    );
+  }
+
+  Widget buildAccountReplaceContent() {
+    return IntrinsicHeight(
+      child: Column(
+        children: [
+          SizedBox(height: 33.w),
+          Assets.images.iconNewsReportAgree.image(height: 76.w),
+          SizedBox(height: 29.w),
+          Text("提交成功",
+              style: TextStyle(
+                  fontSize: 17.sp,
+                  color: '#333333'.color,
+                  fontWeight: FontWeight.bold)),
+          SizedBox(height: 20.w),
+          GestureDetector(
+            onTap: onKnowClick,
+            child: Container(
+              width: 229.w,
+              height: 43.w,
+              decoration: BoxDecoration(
+                color: ColorName.colorPrimary,
+                borderRadius: BorderRadius.circular(100.r),
+              ),
+              child: Center(
+                child: Text("我知道了",
+                    style: TextStyle(
+                        fontSize: 14.sp,
+                        color: Colors.white,
+                        fontWeight: FontWeight.w500)),
+              ),
+            ),
+          ),
+          SizedBox(height: 20.w),
+        ],
+      ),
+    );
+  }
+
+  void onCloseClick() {
+    NewsReportDialog.dismiss();
+  }
+
+  void onKnowClick() {
+    NewsReportDialog.dismiss();
+  }
+}
+

+ 168 - 0
lib/module/news/news_report/news_report_page.dart

@@ -0,0 +1,168 @@
+
+
+import 'package:flutter/cupertino.dart';
+import 'package:flutter/material.dart';
+import 'package:flutter/src/widgets/framework.dart';
+import 'package:flutter_screenutil/flutter_screenutil.dart';
+import 'package:get/get.dart';
+import 'package:get/get_core/src/get_main.dart';
+import 'package:location/utils/common_expand.dart';
+
+import '../../../base/base_page.dart';
+import '../../../resource/colors.gen.dart';
+import '../../../resource/string.gen.dart';
+import '../../../router/app_pages.dart';
+import '../../../widget/common_view.dart';
+import 'news_report_controller.dart';
+import 'news_repost_text_view.dart';
+import 'news_tap_to_dismiss_key_board.dart';
+
+class NewsReportPage extends BasePage<NewsReportController> {
+  const NewsReportPage({super.key});
+
+  static void start() {
+    Get.toNamed(RoutePath.newsReport);
+  }
+
+  @override
+  bool immersive() {
+    return false;
+  }
+
+  @override
+  Widget buildBody(BuildContext context) {
+    // TODO: implement buildBody
+    return NewsTapToDismissKeyBoard(child: Column(
+      children: [
+        buildHeadView(onTap: controller.back),
+        SizedBox(height: 28.w,),
+        Container(
+          padding: EdgeInsets.symmetric(horizontal: 16.w),
+          child: Column(
+            children: [
+              Row(
+                children: [
+                  Text("*",
+                      style: TextStyle(
+                          fontSize: 14.sp,
+                          color: '#FF3C3C'.color,
+                          fontWeight: FontWeight.w500)),
+                  Text("举报内容",
+                      style: TextStyle(
+                          fontSize: 14.sp,
+                          color: "#333333".color,
+                          fontWeight: FontWeight.w500))
+                ],
+              ),
+              SizedBox(height: 10.w,),
+              Container(
+                color: ColorName.white,
+                child: NewsRepostTextView(
+                  controller: controller.reportContetnController,
+                  onChanged: (text) {
+                    // 实时监听文本变化
+                    print('当前内容: $text');
+                    controller.inputContentText(text);
+                  },
+                ),
+              ),
+              SizedBox(height: 20.w,),
+              Row(
+                children: [
+                  Text("*",
+                      style: TextStyle(
+                          fontSize: 14.sp,
+                          color: '#FF3C3C'.color,
+                          fontWeight: FontWeight.w500)),
+                  Text("违规原因",
+                      style: TextStyle(
+                          fontSize: 14.sp,
+                          color: "#333333".color,
+                          fontWeight: FontWeight.w500))
+                ],
+              ),
+              SizedBox(height: 10.w,),
+              Container(
+                height: 44.w,
+                color: ColorName.white,
+                child: TextField(
+                  controller: controller.reportTitleContetnController,
+                  onChanged: (text ) {
+                    controller.inputTitleText(text);
+                  },
+                  decoration:  InputDecoration(
+                    hintText: "请输入违规原因",
+                    border:  OutlineInputBorder(
+                      borderSide: BorderSide(
+                        color: "#12C2C2C2".color,
+                        width: 1.0,
+                      ),
+                    ),
+                    enabledBorder:  OutlineInputBorder(
+                      borderSide: BorderSide(
+                        color: "#12C2C2C2".color,
+                        width: 1.0,
+                      ),
+                    ),
+                    focusedBorder: OutlineInputBorder(
+                      borderSide: BorderSide(
+                        color: "#12C2C2C2".color,
+                        width: 1.0,
+                      ),
+                    ),
+                    // errorText: _errorText,
+                    // counterText: '$_currentLength/${widget.maxLength}', // 显示字数统计
+                  ),
+                ),
+              ),
+              SizedBox(height: 30.w,),
+              Container(
+                child: Obx(() {
+                  return GestureDetector(
+                    onTap: controller.submitBuEnble.value  ? controller.onSubmti : null,
+                    child: Container(
+                      alignment: Alignment.center,
+                      decoration: BoxDecoration(
+                        color: controller.submitBuEnble.value  ? "#7B7DFF".color : ColorName.black30,
+                        borderRadius: BorderRadius.all(Radius.circular(41.w / 2)),
+                      ),
+                      width: 114.w,
+                      height: 41.w,
+                      child: Text(
+                          "提 交",
+                          style: TextStyle(
+                              fontSize: 16.sp, color: ColorName.white, fontWeight: FontWeight.w400)
+                      ),
+
+                    ),
+                  );
+                }),
+              )
+            ],
+          ),
+        )
+      ],
+    ));
+  }
+}
+
+
+Widget buildHeadView({GestureTapCallback? onTap}) {
+  return Container(
+    margin: EdgeInsets.symmetric(horizontal: 12.w, vertical: 14.w),
+    child: Row(
+      crossAxisAlignment: CrossAxisAlignment.center,
+      mainAxisAlignment: MainAxisAlignment.spaceBetween,
+      children: [
+        GestureDetector(
+            onTap: onTap, child: CommonView.getBackBtnView()),
+        Text("举报投诉",
+            style: TextStyle(
+                fontSize: 18.sp,
+                color: '#202020'.color,
+                fontWeight: FontWeight.bold)),
+        SizedBox(width: 24.w, height: 24.w)
+      ],
+    ),
+  );
+}

+ 154 - 0
lib/module/news/news_report/news_repost_text_view.dart

@@ -0,0 +1,154 @@
+import 'package:flutter/material.dart';
+import 'package:location/utils/common_expand.dart';
+
+class NewsRepostTextView extends StatefulWidget {
+  final String? initialValue; // 初始值
+  final String hintText; // 提示文本
+  final TextEditingController controller;
+  final ValueChanged<String>? onChanged; // 文本变化回调
+  final VoidCallback? onSubmitted; // 提交回调
+  final int minLength; // 最小字数
+  final int maxLength; // 最大字数
+
+  const NewsRepostTextView({
+    Key? key,
+    this.initialValue,
+    required this.controller,
+    this.hintText = '请输入用户所违规的场景中,让你感到不适的地方(3~500字以内)',
+    this.onChanged,
+    this.onSubmitted,
+    this.minLength = 3,
+    this.maxLength = 500,
+  }) : super(key: key);
+
+  @override
+  _NewsRepostTextViewState createState() => _NewsRepostTextViewState();
+}
+
+class _NewsRepostTextViewState extends State<NewsRepostTextView> {
+  late TextEditingController _controller;
+  late FocusNode _focusNode;
+  bool _isValid = true; // 当前输入是否有效
+  int _currentLength = 0; // 当前字数
+
+  @override
+  void initState() {
+    super.initState();
+    _controller = widget.controller;//TextEditingController(text: widget.initialValue);
+    _focusNode = FocusNode();
+    _currentLength = widget.initialValue?.length ?? 0;
+    _validateText();
+
+    // 监听文本变化
+    _controller.addListener(() {
+      setState(() {
+        _currentLength = _controller.text.length;
+        _validateText();
+        widget.onChanged?.call(_controller.text);
+      });
+    });
+  }
+
+  @override
+  void dispose() {
+    _controller.dispose();
+    _focusNode.dispose();
+    super.dispose();
+  }
+
+  // 验证文本长度
+  void _validateText() {
+    final text = _controller.text;
+    _isValid = text.length >= widget.minLength && text.length <= widget.maxLength;
+  }
+
+  // 获取当前文本状态的提示信息
+  String get _lengthStatusText {
+    if (_currentLength < widget.minLength) {
+      return '至少输入${widget.minLength}个字';
+    } else if (_currentLength > widget.maxLength) {
+      return '已超出最大字数限制';
+    } else {
+      return '${_currentLength}/${widget.maxLength}';
+    }
+  }
+
+  // 获取当前文本状态的颜色
+  Color get _lengthStatusColor {
+    if (_currentLength < widget.minLength || _currentLength > widget.maxLength) {
+      return Colors.red;
+    } else {
+      return Colors.grey;
+    }
+  }
+
+  @override
+  Widget build(BuildContext context) {
+    return GestureDetector(
+      onTap: () {
+        // 点击时收起键盘
+        FocusScopeNode currentFocus = FocusScope.of(context);
+        if (!currentFocus.hasPrimaryFocus && currentFocus.focusedChild != null) {
+          FocusManager.instance.primaryFocus?.unfocus();
+        }
+      },
+      child: Column(
+        crossAxisAlignment: CrossAxisAlignment.start,
+        children: [
+          TextField(
+            controller: _controller,
+            focusNode: _focusNode,
+            maxLines: null, // 允许多行输入
+            minLines: 4, // 最小显示行数
+            maxLength: widget.maxLength, // 最大字数限制(UI层限制)
+            keyboardType: TextInputType.multiline,
+            decoration: InputDecoration(
+              hintText: widget.hintText,
+              border:  OutlineInputBorder(
+                borderSide: BorderSide(
+                  color: "#12C2C2C2".color,
+                  width: 1.0,
+                ),
+              ),
+              enabledBorder:  OutlineInputBorder(
+                borderSide: BorderSide(
+                  color: "#12C2C2C2".color,
+                  width: 1.0,
+                ),
+              ),
+
+
+
+              focusedBorder: OutlineInputBorder(
+                  borderSide: BorderSide(
+                    color: _isValid ? "#12C2C2C2".color : Colors.red,
+                    width: 2.0,
+                  ),
+                  borderRadius: BorderRadius.all(Radius.circular(10))
+              ),
+              counterText: '', // 隐藏默认计数器
+            ),
+            onSubmitted: (_) => widget.onSubmitted?.call(),
+          ),
+          SizedBox(height: 8.0),
+          Row(
+            mainAxisAlignment: MainAxisAlignment.spaceBetween,
+            children: [
+              Text(
+                _lengthStatusText,
+                style: TextStyle(color: _lengthStatusColor),
+              ),
+              if (!_isValid)
+                Text(
+                  '字数不符合要求',
+                  style: TextStyle(color: Colors.red),
+                ),
+            ],
+          ),
+        ],
+      ),
+    );
+
+
+  }
+}

+ 37 - 0
lib/module/news/news_report/news_tap_to_dismiss_key_board.dart

@@ -0,0 +1,37 @@
+import 'package:flutter/material.dart';
+
+// 点击空白区域收起键盘的Widget
+class NewsTapToDismissKeyBoard extends StatelessWidget {
+  final Widget child;
+  final bool? enable;
+
+  const NewsTapToDismissKeyBoard({
+    Key? key,
+    required this.child,
+    this.enable = true,
+  }) : super(key: key);
+
+  @override
+  Widget build(BuildContext context) {
+    if (!enable!) return child;
+
+    return GestureDetector(
+      onTap: () {
+        // 点击时收起键盘
+        FocusScopeNode currentFocus = FocusScope.of(context);
+        if (!currentFocus.hasPrimaryFocus && currentFocus.focusedChild != null) {
+          FocusManager.instance.primaryFocus?.unfocus();
+        }
+      },
+      behavior: HitTestBehavior.translucent,
+      child: child,
+    );
+  }
+}
+
+// 全局扩展方法,方便在任意Widget上使用
+extension TapToDismiss on Widget {
+  Widget get dismissKeyboardOnTap {
+    return NewsTapToDismissKeyBoard(child: this);
+  }
+}

+ 20 - 0
lib/resource/assets.gen.dart

@@ -320,6 +320,22 @@ class $AssetsImagesGen {
   AssetGenImage get iconNewsItem =>
       const AssetGenImage('assets/images/icon_news_item.webp');
 
+  /// File path: assets/images/icon_news_more.webp
+  AssetGenImage get iconNewsMore =>
+      const AssetGenImage('assets/images/icon_news_more.webp');
+
+  /// File path: assets/images/icon_news_report.webp
+  AssetGenImage get iconNewsReport =>
+      const AssetGenImage('assets/images/icon_news_report.webp');
+
+  /// File path: assets/images/icon_news_report_agree.webp
+  AssetGenImage get iconNewsReportAgree =>
+      const AssetGenImage('assets/images/icon_news_report_agree.webp');
+
+  /// File path: assets/images/icon_news_report_bg.webp
+  AssetGenImage get iconNewsReportBg =>
+      const AssetGenImage('assets/images/icon_news_report_bg.webp');
+
   /// File path: assets/images/icon_splash_title.webp
   AssetGenImage get iconSplashTitle =>
       const AssetGenImage('assets/images/icon_splash_title.webp');
@@ -471,6 +487,10 @@ class $AssetsImagesGen {
         iconMineUrgentContact,
         iconNews,
         iconNewsItem,
+        iconNewsMore,
+        iconNewsReport,
+        iconNewsReportAgree,
+        iconNewsReportBg,
         iconSplashTitle,
         iconTrackLocation,
         iconTrackLocationNow,

+ 5 - 0
lib/router/app_pages.dart

@@ -30,6 +30,8 @@ import '../module/login/login_page.dart';
 import '../module/main/main_controller.dart';
 import '../module/mine/mine_controller.dart';
 import '../module/news/news_controller.dart';
+import '../module/news/news_report/news_report_controller.dart';
+import '../module/news/news_report/news_report_page.dart';
 import '../module/splash/splash_page.dart';
 import '../module/track/track_controller.dart';
 import '../module/track/track_page.dart';
@@ -51,6 +53,7 @@ abstract class RoutePath {
   static const track = '/track';
   static const trackDetail = '/trackDetail';
   static const news = '/news';
+  static const newsReport = '/newsReport';
   static const newsPendingList = '/newsPendingList';
   static const urgentContact = '/urgentContact';
   static const feedback = '/feedback';
@@ -71,6 +74,7 @@ class AppBinding extends Bindings {
     lazyPut(() => getIt.get<MemberController>());
     lazyPut(() => getIt.get<TrackController>());
     lazyPut(() => getIt.get<NewsController>());
+    lazyPut(() => getIt.get<NewsReportController>());
     lazyPut(() => getIt.get<NewsPendingListController>());
     lazyPut(() => getIt.get<UrgentContactController>());
     lazyPut(() => getIt.get<AddUrgentContactController>());
@@ -96,6 +100,7 @@ final generalPages = [
   GetPage(name: RoutePath.member, page: () => MemberPage()),
   GetPage(name: RoutePath.track, page: () => TrackPage()),
   GetPage(name: RoutePath.news, page: () => NewsPage()),
+  GetPage(name: RoutePath.newsReport, page: () => NewsReportPage()),
   GetPage(name: RoutePath.newsPendingList, page: () => NewsPendingListPage()),
   GetPage(name: RoutePath.urgentContact, page: () => UrgentContactPage()),
   GetPage(name: RoutePath.feedback, page: () => FeedBackPage()),