Android应用中Firebase用户登录状态持久化指南

Android应用中Firebase用户登录状态持久化指南

本教程详细介绍了如何在android应用中使用firebase authentication实现用户登录状态的持久化。核心在于利用`firebaseauth.getinstance().getcurrentuser()`在应用启动时检查用户是否已登录,并据此决定跳转到主界面或登录界面。文章提供了两种实现策略:通过启动画面(splash screen)进行检查,或直接在登录界面进行判断,并附带示例代码和注意事项,旨在帮助开发者构建流畅的用户体验。

在开发Android应用时,用户登录功能是常见的需求。为了提供良好的用户体验,应用通常需要在用户成功登录一次后,自动保持其登录状态,避免每次启动应用时都要求用户重新输入凭据。Firebase Authentication提供了一套强大的解决方案来管理用户身份验证和会话。本文将详细阐述如何在Android应用中利用Firebase实现用户登录状态的持久化。

理解Firebase登录状态管理

Firebase Authentication默认会持久化用户的登录状态。这意味着一旦用户成功登录,Firebase会在本地存储用户的会话信息,即使应用被关闭或设备重启,用户仍然被视为已登录。因此,我们不需要额外编写代码来“保存”登录状态,而只需在应用启动时“检查”是否存在有效的登录会话。

当用户通过signInWithEmailAndPassword等方法成功登录后,Firebase会自动处理后续的会话管理。我们面临的主要任务是:在应用启动时,如何判断用户是否已经登录,并据此导航到正确的界面(例如,如果已登录则直接进入主界面,否则进入登录界面)。

核心检查逻辑:getCurrentUser()

Firebase提供了一个关键方法来获取当前已登录的用户:FirebaseAuth.getInstance().getCurrentUser()。

如果存在已登录的用户会话,此方法将返回一个FirebaseUser对象(非空)。如果没有用户登录,或者会话已过期,此方法将返回null。

利用这个特性,我们可以在应用启动的早期阶段进行判断。

实现策略一:通过启动画面(Splash Screen)进行检查(推荐)

将登录状态检查逻辑放在一个专门的启动画面(Splash Screen)Activity中是最佳实践。这样可以避免在主界面或登录界面进行复杂的初始化逻辑,同时提供更流畅的用户体验。

1. 创建启动画面Activity

首先,创建一个名为SplashActivity的Activity,并将其设置为应用的启动Activity(在AndroidManifest.xml中配置)。

2. 在SplashActivity中检查登录状态

在SplashActivity的onCreate()方法中,执行以下逻辑:

AppMall应用商店 AppMall应用商店

AI应用商店,提供即时交付、按需付费的人工智能应用服务

AppMall应用商店 56 查看详情 AppMall应用商店

import android.content.Intent;import android.os.Bundle;import androidx.appcompat.app.AppCompatActivity;import com.google.firebase.auth.FirebaseAuth;import com.google.firebase.auth.FirebaseUser;import java.util.Objects;public class SplashActivity extends AppCompatActivity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        // 可以设置一个简单的布局,或者不设置,取决于你的设计        // setContentView(R.layout.activity_splash);         // 延迟一段时间(可选,用于展示品牌Logo等)        // new Handler(Looper.getMainLooper()).postDelayed(() -> {            checkCurrentUserAndRedirect();        // }, 1000); // 例如,延迟1秒    }    private void checkCurrentUserAndRedirect() {        FirebaseUser currentUser = FirebaseAuth.getInstance().getCurrentUser();        if (Objects.nonNull(currentUser)) {            // 用户已登录,直接跳转到主界面            startActivity(new Intent(this, MainActivity.class));        } else {            // 没有用户登录,跳转到登录界面            startActivity(new Intent(this, LoginActivity.class));        }        // 结束SplashActivity,防止用户返回        finish();    }}

代码解释:

FirebaseUser currentUser = FirebaseAuth.getInstance().getCurrentUser();: 获取当前Firebase用户实例。if (Objects.nonNull(currentUser)): 判断currentUser是否为非空。如果非空,表示用户已登录。startActivity(new Intent(this, MainActivity.class));: 跳转到应用的主界面(例如MainActivity.class)。startActivity(new Intent(this, LoginActivity.class));: 如果用户未登录,则跳转到登录界面(例如LoginActivity.class)。finish();: 在完成跳转后,立即结束SplashActivity。这可以防止用户在按返回键时重新回到启动画面,优化用户体验。

3. 配置AndroidManifest.xml

确保SplashActivity被设置为启动Activity:

    <application        ...                                                                                                ...    

实现策略二:在登录界面(LoginActivity)进行检查(备选)

如果你不想使用启动画面,也可以在LoginActivity中进行用户状态检查。这种方法会略微影响用户体验,因为用户可能会短暂地看到登录界面,然后才被重定向。

1. 在LoginActivity中检查登录状态

在LoginActivity的onCreate()方法中,在进行任何UI初始化之前,添加以下逻辑:

import android.content.Intent;import android.os.Bundle;import androidx.appcompat.app.AppCompatActivity;import com.google.firebase.auth.FirebaseAuth;import com.google.firebase.auth.FirebaseUser;import java.util.Objects;public class LoginActivity extends AppCompatActivity {    private FirebaseAuth auth;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        auth = FirebaseAuth.getInstance();        // 在设置布局和初始化UI之前检查用户状态        FirebaseUser currentUser = auth.getCurrentUser();        if (Objects.nonNull(currentUser)) {            // 用户已登录,直接跳转到主界面            startActivity(new Intent(this, MainActivity.class));            finish(); // 结束LoginActivity            return; // 阻止后续UI初始化        }        // 如果用户未登录,则继续初始化登录界面        setContentView(R.layout.activity_login);        // ... 其他登录界面的UI初始化和事件监听代码        // 例如:        // Button loginButton = findViewById(R.id.login_button);        // loginButton.setOnClickListener(v -> performLogin());    }    // 示例:用户通过邮箱密码登录    private void performLogin(String email, String password) {        auth.signInWithEmailAndPassword(email, password)                .addOnCompleteListener(this, task -> {                    if (task.isSuccessful()){                        // 登录成功,跳转到主界面                        Intent intent = new Intent(LoginActivity.this, MainActivity.class);                        // 使用FLAG_ACTIVITY_CLEAR_TASK和FLAG_ACTIVITY_NEW_TASK清除任务栈,                        // 防止用户返回到登录界面                        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);                        startActivity(intent);                        finish(); // 结束LoginActivity                    } else {                        // 登录失败                        Toast.makeText(LoginActivity.this, "登录失败: " + task.getException().getMessage(), Toast.LENGTH_SHORT).show();                    }                });    }}

代码解释:

在onCreate()的开始处检查currentUser。如果用户已登录,直接跳转到MainActivity并调用finish()。return;语句很重要,它会阻止LoginActivity继续执行后续的UI初始化代码。如果用户未登录,则正常加载activity_login布局并继续登录流程。在performLogin方法中,当用户成功登录后,使用Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK标志来清除任务栈,确保用户无法通过返回键回到登录界面。

注意事项和最佳实践

finish()的重要性: 在重定向到目标Activity后,务必调用finish()来销毁当前Activity(无论是SplashActivity还是LoginActivity),这样可以防止用户按返回键时回到不应该出现的界面。Intent Flags: 当用户成功登录并跳转到主界面时,使用Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK是一个好习惯。这会清除当前任务栈中所有Activity,并创建一个新的任务栈来放置主界面,确保主界面成为任务栈的根Activity。用户体验: 启动画面方法通常提供更好的用户体验,因为它可以在后台静默完成检查,避免用户看到登录界面闪烁。如果启动画面需要加载资源或执行其他初始化,可以考虑在检查逻辑中加入一个短暂的延迟。错误处理: getCurrentUser()通常不会抛出异常,但在实际的登录(如signInWithEmailAndPassword)过程中,务必添加适当的错误处理(例如addOnFailureListener或检查task.isSuccessful())。离线状态: Firebase Authentication在离线状态下也能提供一定程度的会话管理。即使没有网络连接,getCurrentUser()也可能返回一个有效的用户对象,前提是用户之前成功登录过。

总结

通过利用FirebaseAuth.getInstance().getCurrentUser()方法,我们可以轻松地在Android应用中实现Firebase用户的登录状态持久化。无论选择通过启动画面还是在登录界面进行检查,核心逻辑都是判断FirebaseUser是否为非空,并据此进行界面跳转。结合finish()和适当的Intent标志,可以确保用户获得流畅、安全的登录体验。这种模式是构建现代Android应用中用户身份验证功能的基石。

以上就是Android应用中Firebase用户登录状态持久化指南的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/633759.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
VSCode主题切换:自动适应光线
上一篇 2025年11月12日 09:29:28
win11怎么打开注册表编辑器_Win11注册表编辑器打开方法
下一篇 2025年11月12日 09:29:32

相关推荐

  • sublime怎么折叠所有代码_sublime代码折叠快捷方法

    sublime怎么折叠所有代码_sublime代码折叠快捷方法sublime怎么折叠所有代码_sublime代码折叠快捷方法sublime怎么折叠所有代码_sublime代码折叠快捷方法sublime怎么折叠所有代码_sublime代码折叠快捷方法

    Sublime Text 支持多种代码折叠快捷键,Windows/Linux 使用 Ctrl + Shift + [/] 折叠/展开代码块,Ctrl + K, Ctrl + 1 展开所有用 Ctrl + K, Ctrl + J,macOS 用户将 Ctrl 替换为 Command。 在 Sublim…

    2026年9月25日 • 用户投稿
    100
  • vivo Z5的GPU是什么

    vivo Z5的GPU是什么vivo Z5的GPU是什么vivo Z5的GPU是什么vivo Z5的GPU是什么

    vivo Z5 搭载了 Adreno 612 GPU,与前代相比,其性能提升 35%,能效更高,支持 HDR10+,兼容 Vulkan 和 OpenGL ES,并集成了 Qualcomm AI Engine,可加速机器学习任务。 vivo Z5 的 GPU vivo Z5 智能手机搭载了 Adren…

    2026年9月25日 • 用户投稿
    000
  • 华硕TUF RTX 4090显卡拆解 19相供电设计分析

    华硕TUF RTX 4090显卡拆解 19相供电设计分析华硕TUF RTX 4090显卡拆解 19相供电设计分析华硕TUF RTX 4090显卡拆解 19相供电设计分析华硕TUF RTX 4090显卡拆解 19相供电设计分析

    华硕tuf rtx 4090显卡的19相供电设计相比其他显卡具有更稳定、更纯净的电流输出优势。1. 降低纹波电压,提高gpu核心稳定性;2. 提高供电效率,降低mosfet温度;3. 增强超频潜力,提供更大性能提升空间;4. 延长显卡寿命,降低工作温度。判断其供电设计是否优秀,可从元件选择、pwm控…

    2026年9月25日 • 用户投稿
    000
  • 政府机构 5000 万台电脑将替换为国产 Linux

    政府机构 5000 万台电脑将替换为国产 Linux政府机构 5000 万台电脑将替换为国产 Linux政府机构 5000 万台电脑将替换为国产 Linux政府机构 5000 万台电脑将替换为国产 Linux

    点击上方“芋道源码”,选择“设为星标” 无论是前浪,还是后浪? 只要能浪,就是好浪! 每日 10:33 更新文章,让你每天都有点点收获… 精选源码专栏 原创 | Java 2021 超神之路,很肝~带中文详细注释的开源项目Dubbo RPC 框架源码解析Netty 网络应用框架源码解析R…

    2026年9月25日 • 用户投稿
    300
  • 想将 AI 模型组装工具与豆包联用完成模型组装?方法详解​

    想将 AI 模型组装工具与豆包联用完成模型组装?方法详解​想将 AI 模型组装工具与豆包联用完成模型组装?方法详解​想将 AI 模型组装工具与豆包联用完成模型组装?方法详解​想将 AI 模型组装工具与豆包联用完成模型组装?方法详解​

    ai模型组装工具与豆包联用是可行且高效的,关键在于接口兼容性、数据流转和部署方式。具体步骤如下:1. 理解豆包的模型接入规范,包括支持的模型格式、api调用方式及资源需求;2. 在组装工具中完成模型构建、训练与导出,确保符合平台要求;3. 如需转换模型格式(如pytorch转onnx),使用相应工具…

    2026年9月25日 • 用户投稿
    000
  • 荣耀 X70 开售 内置 8300mAh 超大电池 128GB 售 1399 元

    荣耀 X70 开售 内置 8300mAh 超大电池 128GB 售 1399 元荣耀 X70 开售 内置 8300mAh 超大电池 128GB 售 1399 元荣耀 X70 开售 内置 8300mAh 超大电池 128GB 售 1399 元荣耀 X70 开售 内置 8300mAh 超大电池 128GB 售 1399 元

    荣耀手机官方宣布,其最新千元机型——荣耀 x70 将于 7 月 18 日上午 10 点 08 分正式上市。目前该机起售价为 1399 元,叠加国家补贴后价格低至 1189 元。 核心性能方面,荣耀 X70 搭载了第四代骁龙 6 移动平台,该平台采用八核 CPU 架构,具体为 1 × A720*2.3…

    2026年9月25日 • 用户投稿
    300
  • AI Overviews如何实现数据自动备份 AI Overviews备份策略设置

    AI Overviews如何实现数据自动备份 AI Overviews备份策略设置AI Overviews如何实现数据自动备份 AI Overviews备份策略设置AI Overviews如何实现数据自动备份 AI Overviews备份策略设置AI Overviews如何实现数据自动备份 AI Overviews备份策略设置

    ai overviews可以辅助制定数据备份策略,但不直接执行备份。1. 使用关键词搜索可获取不同平台的备份设置步骤;2. 汇总备份频率、存储位置及安全加密建议;3. 可学习选择合适工具、设定备份路径与启用加密机制;4. 避免忽略日志检查、空间预留、版本控制与单一备份依赖;5. 建议结合手动验证、通…

    2026年9月25日 • 用户投稿
    200
  • 解析音调调整指令:一个Java教程

    解析音调调整指令:一个Java教程解析音调调整指令:一个Java教程解析音调调整指令:一个Java教程解析音调调整指令:一个Java教程

    本文旨在提供一个清晰易懂的Java教程,用于解析包含音调调整指令的字符串。通过使用正则表达式,我们可以从复杂的输入字符串中提取乐器名称、调整方向和调整量。本教程将详细解释代码实现,并提供示例,帮助读者理解如何在Java中处理这类问题。 使用正则表达式解析音调调整指令 在音乐领域,音调的微调至关重要。…

    2026年9月25日 • 用户投稿
    000
  • 京东商智品牌版流量、交易、商品数据下载体验升级,具体升级了哪些内容? 商家必看!京东商智数据下载大升级,时段对比+滞销预警功能上线!

    京东商智品牌版流量、交易、商品数据下载体验升级,具体升级了哪些内容? 商家必看!京东商智数据下载大升级,时段对比+滞销预警功能上线!京东商智品牌版流量、交易、商品数据下载体验升级,具体升级了哪些内容? 商家必看!京东商智数据下载大升级,时段对比+滞销预警功能上线!京东商智品牌版流量、交易、商品数据下载体验升级,具体升级了哪些内容? 商家必看!京东商智数据下载大升级,时段对比+滞销预警功能上线!京东商智品牌版流量、交易、商品数据下载体验升级,具体升级了哪些内容? 商家必看!京东商智数据下载大升级,时段对比+滞销预警功能上线!

    在数字化运营的新纪元,数据获取的精准度已成为影响商业决策的核心要素。2023年3月,京东商智品牌版正式启动对流量、交易与商品数据下载功能的全面优化升级,推出四级渠道细分维度、sku查询容量提升至100个、时间筛选更精细化等一系列关键更新,并同步完成54项服务权益的迭代升级,标志着电商平台数据分析服务…

    2026年9月25日 • 用户投稿
    600
  • 货拉拉司机版怎样设置自动抢单参数_货拉拉司机版自动抢单的配置优化方法

    货拉拉司机版怎样设置自动抢单参数_货拉拉司机版自动抢单的配置优化方法货拉拉司机版怎样设置自动抢单参数_货拉拉司机版自动抢单的配置优化方法货拉拉司机版怎样设置自动抢单参数_货拉拉司机版自动抢单的配置优化方法货拉拉司机版怎样设置自动抢单参数_货拉拉司机版自动抢单的配置优化方法

    开启自动抢单并设置合理接单范围、筛选目标订单类型、匹配出车时间段及启用顺路单优先功能,可显著提升货拉拉司机接单效率。 如果您希望在货拉拉司机版中提升接单效率,合理配置自动抢单参数是关键。系统默认设置可能无法满足高峰时段或特定区域的接单需求,因此需要根据实际运营情况调整相关选项。以下是优化自动抢单配置…

    2026年9月25日 • 用户投稿
    000
  • 小熊电器回应“养生壶爆炸致一岁孩童烫伤”:正在调查当中

    小熊电器回应“养生壶爆炸致一岁孩童烫伤”:正在调查当中小熊电器回应“养生壶爆炸致一岁孩童烫伤”:正在调查当中小熊电器回应“养生壶爆炸致一岁孩童烫伤”:正在调查当中小熊电器回应“养生壶爆炸致一岁孩童烫伤”:正在调查当中

    感谢网友 Snailwang 的线索投递! 9 月 28 日消息,9 月 27 日,一位济南网民称,当月 20 日家中使用的小熊电器玻璃养生壶突然发生爆裂,导致一名仅一岁的幼儿全身40%遭受大面积烫伤。目前该事件已引发广泛关注,小熊电器相关负责人向第一财经记者回应表示,“事件正在调查当中”。 针对此…

    2026年9月25日 • 用户投稿
    900
  • Java字符串高级解析:使用正则表达式处理复杂指令模式

    Java字符串高级解析:使用正则表达式处理复杂指令模式Java字符串高级解析:使用正则表达式处理复杂指令模式Java字符串高级解析:使用正则表达式处理复杂指令模式Java字符串高级解析:使用正则表达式处理复杂指令模式

    本教程演示如何使用Java的java.util.regex包,通过正则表达式高效解析包含多条调音指令的复杂字符串。我们将学习构建匹配特定模式的正则表达式,并利用Pattern和Matcher类从输入字符串中准确提取乐器名称、调音方向和数值,从而将原始指令转换为清晰可读的输出格式。 1. 问题背景与挑…

    2026年9月25日 • 用户投稿
    000
  • Debian Nginx日志路径在哪里

    Debian Nginx日志路径在哪里Debian Nginx日志路径在哪里Debian Nginx日志路径在哪里Debian Nginx日志路径在哪里

    Debian系统中,Nginx的访问日志和错误日志默认存储位置如下: 访问日志 (access log): /var/log/nginx/access.log错误日志 (error log): /var/log/nginx/error.log 以上路径是标准Debian Nginx安装的默认配置。如…

    2026年9月25日 • 用户投稿
    100
  • sublime如何同步多台电脑的配置和插件 _sublime多设备配置同步方法

    sublime如何同步多台电脑的配置和插件 _sublime多设备配置同步方法sublime如何同步多台电脑的配置和插件 _sublime多设备配置同步方法sublime如何同步多台电脑的配置和插件 _sublime多设备配置同步方法sublime如何同步多台电脑的配置和插件 _sublime多设备配置同步方法

    通过管理Sublime Text配置目录并结合云盘或Git实现多设备同步。将Packages目录移至云盘并创建符号链接,或用Git版本化关键配置文件,配合Package Control自动恢复插件,确保各设备设置一致。 Sublime Text 是许多开发者喜爱的轻量级编辑器,跨设备使用时保持配置和…

    2026年9月25日 • 用户投稿
    000
  • 怎么用豆包AI帮我优化NumPy运算 3个技巧让AI加速科学计算

    怎么用豆包AI帮我优化NumPy运算 3个技巧让AI加速科学计算怎么用豆包AI帮我优化NumPy运算 3个技巧让AI加速科学计算怎么用豆包AI帮我优化NumPy运算 3个技巧让AI加速科学计算怎么用豆包AI帮我优化NumPy运算 3个技巧让AI加速科学计算

    豆包ai可通过三个技巧优化numpy计算效率。1. 描述逻辑让ai生成高效向量化表达式,如用np.mean(arr * (arr > 0), axis=1)替代循环求每行正数均值;2. 提供现有代码让ai分析瓶颈并提出优化建议,如将显式循环改为np.where(np.sum(arr, axis…

    2026年9月25日 • 用户投稿
    000
  • sublime如何卸载插件 _sublime插件卸载教程

    sublime如何卸载插件 _sublime插件卸载教程sublime如何卸载插件 _sublime插件卸载教程sublime如何卸载插件 _sublime插件卸载教程sublime如何卸载插件 _sublime插件卸载教程

    通过Package Control卸载:打开Sublime Text,调出命令面板,输入Remove Package,选择插件并删除;2. 手动删除:关闭软件后进入Packages目录,删除对应插件文件夹;3. 注意清理User目录下的残留配置文件,避免冗余。操作安全,不影响主程序。 在 Subli…

    2026年9月25日 • 用户投稿
    000
  • 如何配置Debian Apache日志格式

    如何配置Debian Apache日志格式如何配置Debian Apache日志格式如何配置Debian Apache日志格式如何配置Debian Apache日志格式

    本文介绍如何在Debian系统上自定义Apache的日志格式。 以下步骤将指导您完成配置过程: 第一步:访问Apache配置文件 Debian系统的Apache主配置文件通常位于 /etc/apache2/apache2.conf 或 /etc/apache2/httpd.conf。 使用以下命令以…

    2026年9月25日 • 用户投稿
    100
  • Java中整数类型溢出行为详解:二进制补码与循环特性

    Java中整数类型溢出行为详解:二进制补码与循环特性Java中整数类型溢出行为详解:二进制补码与循环特性Java中整数类型溢出行为详解:二进制补码与循环特性Java中整数类型溢出行为详解:二进制补码与循环特性

    Java中原始整数类型在处理超出其范围的数值时,会遵循一种基于二进制补码的循环溢出机制。这意味着当正数溢出时会“回卷”为负数,反之亦然,如同数字在一个有限的圆环上循环。理解这一特性对于准确预测类型转换和算术运算结果至关重要。 计算机中的数值表示:位、字节与二进制 在计算机底层,所有数据都以二进制形式…

    2026年9月25日 • 用户投稿
    000
  • Java数据类型溢出:原理、预测与避免

    Java数据类型溢出:原理、预测与避免Java数据类型溢出:原理、预测与避免Java数据类型溢出:原理、预测与避免Java数据类型溢出:原理、预测与避免

    本文旨在深入解析Java中数据类型溢出的现象,阐述其背后的二进制补码原理,并提供预测溢出结果的方法。通过理解数据在计算机中的存储方式,以及溢出时数值的循环特性,开发者可以更好地掌握Java中的数据类型,避免潜在的错误。 数据在计算机中的存储:二进制补码 计算机底层使用二进制(bits)来表示所有数据…

    2026年9月25日 • 用户投稿
    000
  • 自媒体如何利用节日营销_利用节日进行自媒体营销的实用方法

    自媒体如何利用节日营销_利用节日进行自媒体营销的实用方法自媒体如何利用节日营销_利用节日进行自媒体营销的实用方法自媒体如何利用节日营销_利用节日进行自媒体营销的实用方法自媒体如何利用节日营销_利用节日进行自媒体营销的实用方法

    节日营销需提前策划主题内容、打造专属视觉风格、发起互动活动、联合账号推广并推出限时福利,通过预热内容、统一设计、用户参与、跨界合作与专属优惠增强粉丝粘性并扩大影响力。 当节日临近时,用户对相关内容的关注度显著提升,自媒体平台上的互动和流量通常会出现明显增长。抓住这一时机进行有针对性的内容策划与推广,…

    2026年9月25日 • 用户投稿
    000

发表回复

登录后才能评论
关注微信