自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(307)
  • 资源 (1)
  • 收藏
  • 关注

原创 打造专业级ChatGPT风格聊天界面:SpringBoot与Vue实现动态打字机效果,附完整前后端源码

打造专业级ChatGPT风格聊天界面:SpringBoot与Vue实现动态打字机效果,附完整前后端源码。Web开发的世界永远充满惊喜,不是吗?每当我们认为自己掌握了所有的技巧和工具,总会有新的技术出现,挑战我们的知识库。今天,我们要探讨的这项技术可能对一些人来说并不陌生,但对于其他人来说,则像是新发现的宝藏。没错,我在说的是Server-Sent Events(SSE)。你可能会问:“SSE是什么?”简单来说,SSE是一种让服务器实时向客户端发送更新的技术。但别误会,这不是另一个WebSockets。让我们

2024-01-23 14:32:40 19494 121

原创 【云原生生态圈】:Docker核心技术全面总结

本文将分别讲解什么是Docker,如何安装Docker,Docker的镜像操作,Docker容器操作,以实战为线索,逐步深入Docker相关知识,打造完整的Docker学习体系,可查阅,可复习,建议收藏。

2022-06-02 21:06:07 9886 192

原创 Vue安装步骤及教程(详细)

本专栏将从基础开始,循序渐进的讲解Vue的基本概念以及使用,希望大家都能够从中有所收获,也请大家多多支持。如果文章知识点有错误的地方,请指正!大家一起学习,一起进步。

2022-05-26 22:53:02 21365

原创 JAVA实现QQ登录、注册、修改密码等功能(美化版)

本文用Java的==awt组件==、==swing组件==以及==数据库JDBC==写了一个==仿QQ登录==的界面,具体演示如下图所示,包括三个页面,分别**是登录窗口(MainFrame)**、**注册窗口(RegisterUI)**和**忘记密码窗口(ForgetUI)**。本文主要应用的技术有:==JAVA-GUI、JAVA的awt组件、swing组件、事件处理、JDBC==等,是初学者学习和练手的好项目。准备好了吗,<font color="red">let's get it!</font>

2022-05-12 10:34:33 21765 81

原创 【初探篇】Nginx的安装部署

文章目录虚拟机安装虚拟机安装CentOS7.41 新建虚拟机2 选择典型3 选择CentOS镜像4 存储位置5 虚拟机磁盘配置6 自定义其他配置电脑配置系统安装1 虚拟机配置完成之后进入系统安装界面2 选择安装语言3 分区选择4 开始安装5 安装完成Linux配置配置上网配置静态ip不能上网的错误排查一些公网DNS服务器Centos7 防火墙的关闭宝塔Linux面板安装教程Nginx的安装使用宝塔面板安装使用源码编译安装如果出现警告或报错安装成系统服务相关软件下载地址:链接:https://pan.bai

2022-04-29 19:47:21 17958 26

原创 【超详细】私有仓库Gitlab的安装与使用详细教程

1. GitLab简介​ GitLab 是由 GitLabInc.开发,使用 MIT 许可证的基于网络的 Git 仓库管理工具,且具有wiki 和 issue 跟踪功能。使用 Git 作为代码管理工具,并在此基础上搭建起来的 web 服务。2. GitLab官网地址官网地址:https://about.gitlab.com/安装说明:https://about.gitlab.com/installation/3. GitLab安装3.1 服务器准备​ 准备一个系统为 CentOS7 以上版本的

2022-04-29 14:31:40 11116

原创 探索 GPT-4o Mini:开发者的新利器

在人工智能领域,OpenAI 始终走在前沿,其最新发布的 GPT-4o mini 模型再次引发了广泛关注。在实际应用中,GPT-4o mini 已经展现出强大的潜力和广泛的适用性。OpenAI 最新发布的 GPT-4o mini 模型以其卓越的性能和极具竞争力的价格引发了广泛关注。随着 GPT-4o mini 的普及,我们可以预见更多创新应用的诞生。GPT-4o mini 在保留 GPT-4 强大功能的同时,进行了轻量化设计,使其在性能和成本之间达到了理想平衡。这对于加快开发进程-aicnn.cn。

2024-07-24 18:05:39 1202

原创 6 Go语言的常量、枚举、作用域

虽然可以将这些值硬编码到代码中以实现类似效果,但经验表明,虽然这些值在运行时不需要更改,但将来可能需要更改。换句话说,当你的代码使用一个变量时,Go 需要确定该变量的定义位置。如果在当前作用域找不到该变量,Go 会查看父作用域,然后是祖父作用域,一直到包作用域。在这个练习中,我们使用常量来定义在代码运行时不需要更改的值。我们用不同的语法选项声明了常量,有的指定了类型,有的则没有。我们会使用 Go 的。例如,在以下代码中,我们将一周的天数定义为常量。接下来,我们将查看与常量相关的变体-aicnn.cn。

2024-07-24 17:13:19 855

原创 5 Go语言的值与指针

如果你有一个指针变量或者将一个变量的指针传递给函数,那么在函数中对该变量的值所做的任何更改也会影响函数外部的变量值。例如,如果你需要判断一个值是否存在,非指针值总会有一个零值,这在逻辑上可能是有效的。我们看到,当通过值传递时,对函数中的值所做的更改不会影响传递给函数的变量的值,而通过指针传递值会改变传递给函数的变量的值。这样的值,当你将它们传递给函数时,Go会创建一个值的副本,并在函数中使用这个副本。你可以将指针与同类型的其他指针进行比较,但只有在比较的是指针自身时才会结果为真-aicnn.cn。

2024-07-24 17:11:18 1040

原创 4 Go语言的操作符

虽然变量用于存储应用程序中的数据,但当你开始使用它们构建软件逻辑时,它们才真正发挥作用。使用操作符,你可以将数据与其他数据进行比较——例如,你可以检查在交易应用程序中一个价格是否过低或过高。例如,你可以使用操作符将购物车中所有商品的费用相加,得到总价格。注意保持代码的可读性,如果在实际编程中使用一行语句处理多个变量导致代码难以理解,建议使用更多的代码行以提高可读性。在应用程序中,逻辑决策是通过比较变量的值与定义的规则来实现的。在这个练习中-aicnn.cn。

2024-07-24 17:08:46 1048

原创 3 Go语言的变量声明

当你声明一个变量时,你需要四个要素:声明变量的语句、变量的名称、变量能够存储的数据类型以及它的初始值。需要注意的是,当声明类型时,所有的值必须具有相同的类型。在这个练习中,我们将更新之前的练习,使其跳过变量声明中的可选初始值或类型声明。在这个练习中,我们能够更新之前的代码,使用更紧凑的变量声明方式。在这个练习中,我们将更新之前的代码,使用短变量声明的方式。变量有类型但没有初始值,现在我们将它更改为具有初始值,因为在使用短变量声明时这是必需的。在本练习中,我们将定义一些变量...-aicnn.cn。

2024-07-24 17:06:20 1058

原创 2 Go语言的基础代码解析

在这里,我们声明了一个全局变量,它是一个字符串列表,并用数据进行初始化。而在映射类型(map)中,你可以选择键的类型,用来根据其他数据查找映射中的值。这是因为我们的列表是一个切片(slice),其键从0开始,每个值递增1。在这个练习中,我们将利用之前示例中学到的一些知识,打印一个随机数量(1到5之间)的星号(*****)到控制台。这个练习将帮助你感受使用Go语言的工作方式,并练习一些我们在后续学习中会用到的Go语言特性。在这个简单的Go程序中,我们涵盖了许多关键概念,这些概念将在接下来..aicnn.cn。

2024-07-24 17:03:11 1094

原创 1 go语言环境的搭建

每种编程语言都需要一个开发环境,Go 也不例外。如果你已经编写了一两个 Go 程序,那么你就已经有了一个工作环境,但你可能已经错过了一些更新的技术和工具。如果这是你第一次在电脑上安装 Go,不用担心;安装 Go 及其支持工具非常简单。设置环境并验证后,您将构建一个简单的程序,了解构建和运行 Go 代码的不同方法,然后探索一些能让 Go 开发更轻松的工具和技术。

2024-07-22 15:48:56 750

原创 day01-HTML基础

网页有图片、链接、文字等元素组成,我们后面的任务就是要把这部分网页元素用代码写出来。标签名定义说明HTML标签页面中最大的标签,我们成为 根标签文档的头部注意在head标签中我们必须要设置的标签是title文档的标题让页面拥有一个属于自己的网页标题文档的主体元素包含文档的所有内容,页面内容 基本都是放到body里面的**课堂练习1: **书写我们的第一个HTML 页面。新建一个 01-html骨架标签 的 html 文件。里面写入刚才的HTML 骨架。

2024-01-08 11:32:30 1056 1

原创 Spring Security in Action 第十八章 手把手OAuth2应用

在18.2.3节中,我们设法获得了一个访问令牌。我们还添加了一个客户端注册,并配置了用户来获取令牌。但是,令牌仍然没有提供我们的资源服务器在应用授权规则时需要的所有细节。为了给我们的方案写一个完整的应用程序,我们需要为我们的用户添加角色。为一个用户添加角色很简单。左侧菜单中的 "角色 "选项卡允许你找到所有角色的列表并添加新的角色,如图18.19所示。我创建了两个新角色:fitnessuser和fitnessadmin。

2023-02-12 19:54:12 964 3

原创 Spring Security in Action 第十七章 全局方法安全:预过滤和后过滤

在第16章中,你学会了如何使用全局方法安全来应用授权规则。我们研究了使用@PreAuthorize和@PostAuthorize注解的例子。通过使用这些注解,你可以应用一种方法,即应用程序要么允许方法调用,要么完全拒绝调用。 假设你不想禁止调用一个方法,但你想确保发送给它的参数遵循一些规则。或者,在另一种情况下,你想确保有人调用该方法后,该方法的调用者只收到返回值的授权部分。我们将这样的功能命名为过滤,并将其分为两类。图17.1 客户端调用api,提供一个不符合授权规则的值。在预授权的情况下,该方法根本就没

2023-02-12 19:51:59 705

原创 Spring Security in Action 第十六章 SpringSecurity全局方法安全:预先和事后授权

到现在为止,我们讨论了配置认证的各种方法。我们在第2章中从最直接的方法–HTTP Basic开始,然后我在第5章中向你展示了如何设置表单登录。我们在第12章到第15章中讨论了OAuth 2。但在授权方面,我们只讨论了api层面的配置。假设你的应用不是Web应用–你不能也使用Spring Security进行认证和授权吗?Spring Security很适合那些不通过HTTP api使用你的应用程序的场景。在本章中,你将学习如何在方法层面配置授权。我们将使用这种方法来配置Web和非Web应用程序中的授权,我们

2023-02-12 19:50:47 507

原创 Spring Security in Action 第十五章 OAuth 2 使用JWT和加密签名

在这一章中,我们将讨论使用JSON Web令牌(JWTs)来实现令牌。你在第14章中了解到,资源服务器需要验证由授权服务器发出的令牌。我告诉了你三种方法来做到这一点:使用加密签名来验证令牌的好处是允许资源服务器验证令牌,而不需要直接调用授权服务器,也不需要共享数据库。这种实现令牌验证的方法常用于用OAuth 2实现认证和授权的系统中。由于这个原因,你需要知道这种实现令牌验证的方法。我们将为这个方法写一个例子,就像我们在第14章为其他两个方法写的那样。签署令牌最直接的方法是使用对称密钥。使用这种方法,使用同一

2023-02-12 19:49:10 1963

原创 Spring Security in Action 第十四章 实现资源服务器端

在本章中,我们将讨论用Spring Security实现一个资源服务器。 资源服务器是管理用户资源的组件。资源服务器这个名字一开始可能并不引人注意,但就OAuth 2而言,它代表了你所保护的后端,就像我们在前几章所保护的其他应用一样。例如,还记得我们在第11章实现的业务逻辑服务器吗?为了允许客户端访问资源,资源服务器需要一个有效的访问令牌。客户端从授权服务器获得一个访问令牌,并通过在HTTP请求头中添加令牌来调用资源服务器上的资源。图14.1提供了第12章的复习内容,显示了资源服务器在OAuth 2认证架构

2023-02-12 19:46:54 482

原创 Spring Security in Action 第十三章 实现OAuth2的认证端

在本节中,我们将讨论用户管理。authorization server是处理OAuth 2框架中的用户认证的组件。因此,它自然需要管理用户。幸运的是,用户管理的实现与你在第3章和第4章中学到的并没有改变。我们继续使用UserDetails、UserDetailsService和UserDetailsManager接口来管理凭证。而为了管理密码,我们继续使用PasswordEncoder接口。在这里,这些接口具有相同的角色,并且与你在第3章和第4章中学到的相同。

2023-02-12 19:39:22 626

原创 Spring Security in Action 第十二章 OAuth 2是如何工作的?

如果你已经在使用OAuth 2,我知道你在想什么:OAuth 2框架是一个庞大的主题,在四章中,你会学到所有你需要知道的关于用Spring Security应用OAuth 2的知识。在这一章中,我们将从概述开始,你会发现OAuth 2框架的主要角色是用户、客户端、资源服务器和授权服务器。在总体介绍之后,你将学习如何使用Spring Security来实现客户端。然后,在第13章到第15章,我们将讨论实现最后两个组件:资源服务器和授权服务器。为了达到这个目标,在本章中,我们将讨论什么是OAuth 2,然后我们

2023-02-12 19:37:48 771

原创 Spring Security in Action 第十一章 SpringSecurity前后端分离实战

现在又到了将你所学到的东西付诸行动的时候了,这个练习向你展示了整个画面。系好你的安全带,打开你的IDE,准备好迎接一场冒险吧!在本章中,我们将设计一个由三个角色组成的系统:客户端、认证端和业务逻辑端。从这三个角色中,我们将实现认证端的后端部分和一个业务逻辑端。正如你所看到的,我们的例子更加复杂,表明我们越来越接近真实世界的场景了。这个练习也是一个很好的机会来回顾、应用和更好地理解你已经学过的东西,并触及新的主题,如JSON Web Tokens(JWT)。你还可以看到在一个系统中分离认证和授权责任的演示。在

2023-02-12 19:36:13 1147

原创 Spring Security in Action 第六章 一个小型的安全网络应用程序

在完成了用户和密码管理后,我们可以开始编写自定义认证逻辑。要做到这一点,我们必须实现一个AuthenticationProvider(列表6.12),并在Spring Security认证架构中注册它。编写认证逻辑所需的依赖性是UserDetailsService的实现和两个密码编码器。除了自动连接这些,我们还覆盖了authenticate()和supports()方法。我们实现supports()方法来指定支持的认证实现类型是UsernamePasswordAuthenticationToken。

2023-02-12 19:32:40 573

原创 Spring Security in Action 第五章 SpringSecurity实现认证

在这一节中,我们将讨论实现自定义认证逻辑。我们分析了与此责任相关的Spring Security合同,以了解其定义。有了这些细节,你就可以通过第5.1.3节中的一个代码例子来实现自定义认证逻辑。Spring Security中的AuthenticationProvider负责处理认证逻辑。AuthenticationProvider接口的默认实现将寻找系统用户的责任交给了UserDetailsService。在认证过程中,它也使用PasswordEncoder进行密码管理。

2023-02-12 19:29:49 865

原创 Spring Security in Action 第四章 SpringSecurity处理密码的相关讨论

在本节中,我们将讨论PasswordEncoder合约的定义。你实现了这个契约,告诉Spring Security如何验证用户的密码。在验证过程中,PasswordEncoder决定一个密码是否有效。每个系统都会以某种方式存储密码编码。你最好是将它们散列存储,这样就不会有机会被人读取密码。密码编码器也可以对密码进行编码。合同中声明的方法encode()和matches(),实际上是对其责任的定义。这两个都是同一个契约的一部分,因为这些都是强关联的,一个接一个。

2023-02-12 19:28:52 874

原创 Spring Security in Action 第三章 SpringSecurity管理用户

在本节中,你将学习如何实现UserDetails接口来描述你的应用程序中的用户。我们将讨论UserDetails合约所声明的方法,以了解我们如何以及为什么要实现每一个方法。首先,让我们看看下面列表中介绍的接口。清单3.1 UserDetails 接口getUsername()和getPassword()方法返回,正如你所期望的,用户名和密码。应用程序在认证过程中使用这些值,这些是该合同中唯一与认证有关的细节。其他五个方法都与授权用户访问应用程序的资源有关。

2023-02-12 19:26:25 1288

原创 Spring Security in Action 第一、二章 第一个Spring Security项目的建立以及基本

Spring Boot是作为Spring框架的应用开发的一个进化阶段出现的。与其说你需要编写所有的配置,不如说Spring Boot已经预设了一些配置,所以你可以只覆盖那些与你的实现不匹配的配置。我们也称这种方法为 “惯例–配置”。在这种开发应用程序的方式存在之前,开发人员为他们必须创建的所有应用程序反复编写几十行代码。在过去,当我们以单体方式开发大多数架构时,这种情况不太明显。在单体架构下,你只需要在开始时写一次这些配置,之后就很少需要再碰它们。当面向服务的软件架构发展起来后,我们开始感受到为配置每个服务

2023-02-12 19:21:27 1111

原创 Spring Security in Action 第十章 SpringSecurity应用CSRF保护和CORS跨域请求

我们已经了解了过滤器链以及它在Spring Security架构中的作用。我们在第9章中研究了几个例子,在这些例子中我们定制了过滤器链。但Spring Security也会在链上添加自己的过滤器。在本章中,我们将讨论应用CSRF保护的过滤器和与CORS配置相关的过滤器。你将学习如何定制这些过滤器,使之完美地适合你的应用场景。你可能已经注意到,到目前为止的大多数例子中,我们只用HTTP GET实现了我们的api。此外,当我们需要配置HTTP POST时,我们还必须在配置中添加一个补充指令来禁用CSRF保护。之

2023-01-28 11:23:28 623 1

原创 Spring Security in Action 第九章 SpringSecurity常用过滤器介绍

在Spring Security中,HTTP filters(过滤器)对不同的HTTP请求进行过滤。在第三章到第五章,我们讨论了HTTP的认证和授权架构,我经常提到过滤器。在Spring Security中,一般来说,HTTP filters对请求进行过滤。这些过滤器形成了一个责任链。一个过滤器接收一个请求,执行其逻辑,并最终将请求委托给链中的下一个过滤器(图9.1)。图9.1 过滤器链接收请求。每个过滤器使用一个管理器来对请求应用特定的逻辑,并最终将请求沿着链子进一步委托给下一个过滤器。这个想法很简单。当

2023-01-28 11:21:52 1366

原创 Spring Security in Action 第八章 配置授权:api授权

在开发中,我们不太可能对所有请求应用相同的规则。例如某些api,只有一些特定的用户可以调用,而其他api可能是所有人都可以访问的。每个应用程序,根据业务需求,都有自己的自定义授权配置。让我们来讨论一下,当我们写访问配置时,你有哪些选项可以参考不同的请求。

2023-01-20 10:56:10 827 1

原创 Spring Security in Action 第七章 配置授权:限制访问

在本章中,我们将讨论授权。授权是一个过程,在这个过程中,系统决定一个被识别的客户是否具有访问所请求资源的权限。

2023-01-19 17:43:42 893 1

原创 Kafka集群间同步数据方案-Flume

Apache Flume 是一个分布式、高可靠、高可用的用来收集、聚合、转移不同来源的大量日志数据到中央数据仓库的工具。

2022-10-24 11:28:06 3254 1

原创 Doris集群环境搭建

首页 - Apache DorisJava语言开发,存储和维护集群的元数据,负责接收和解析用户的查询请求,规划查询计化,调度查询结果。C++语言开发,Doris 系统的计算和存储节点,根据FE生成的物理执行计划,然后进行查询(分布式,多节点并行执行查询,统一汇总),同时BE还会将数据存储为多副本。BrokerBroker 为一个独立的无状态进程。封装了文件系统接口,提供 Doris 读取远端存储系统中文件的能力,包括HDFS,S3,BOS等。Doris端口列表Doris镜像版本与编译环境对应关系。

2022-10-18 18:27:57 4256

原创 数据准备脚本:Python Pandas OR esProc SPL?

做数据分析和人工智能运算前常常需要大量的数据准备工作,也就是把各种数据源以及各种规格的数据整理成统一的格式。因为情况非常复杂多样,很难有某种可视化工具来完成此项工作,常常需要编程才能实现。业界有很多免费的脚本语言都适合进行数据准备工作,其中Python Pandas具有多种数据源接口和丰富的计算函数,受到众多用户的喜爱;esProc SPL作为一门较新的数据计算语言,在语法灵活性和计算能力方面也很有特色,下面对两者进行多方面的比较。

2022-10-09 10:23:54 3659 18

原创 apollo最佳实战之安装与SpringBoot接入

Apollo(阿波罗)是一款可靠的分布式配置管理中心,诞生于携程框架研发部,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性,适用于微服务配置管理场景。服务端基于Spring Boot和Spring Cloud开发,打包后可以直接运行,不需要额外安装Tomcat等应用容器。

2022-09-15 16:21:01 1601

原创 正则表达式大全

95|98|NT|2000)”能匹配“Windows2000”中的“Windows”,但不能匹配“Windows3.1”中的“Windows”。例如,虽然A和B这两种情况只要有一种能够击中所需要的文本模式就会成功匹配,但是如果只要有一条子表达式 (例如A)会产生误匹配,那么不论其它的子表达式(例如B)效率如何之高,范围如何精准,C的总体精准度也会因A而受到影响。序列“\\”匹配“\”而“\(”则匹配“(”。例如,“o{2,}”不能匹配“Bob”中的“o”,但能匹配“foooood”中的所有o。

2022-09-13 16:30:23 1757

转载 K8S的安全认证

Kubernetes作为一个分布式集群的管理工具,保证集群的安全性是其一个重要的任务。所谓的安全性其实就是保证对Kubernetes的各种客户端进行认证和鉴权操作。客户端:一般是独立于kubernetes之外的其他服务管理的用户账号。:kubernetes管理的账号,用于为Pod中的服务进程在访问Kubernetes时提供身份标识。认证、授权与准入控制ApiServer是访问及管理资源对象的唯一入口。Authentication(认证):身份鉴别,只有正确的账号才能够通过认证。...

2022-08-28 22:17:36 938 2

原创 k8s数据存储详解

是Pod中能够被多个容器访问的共享目录,它被定义在Pod上,然后被一个Pod里的多个容器挂载到具体的文件目录下,kubernetes通过Volume实现同一个Pod中不同容器之间的数据共享以及数据的持久化存储。EmptyDir是在Pod被分配到Node时创建的,它的初始内容为空,并且无须指定宿主机上对应的目录文件,因为kubernetes会自动分配一个目录,当Pod销毁时, EmptyDir中的数据也会被永久删除。PV(Persistent Volume)是持久化卷的意思,是对底层的共享存储的一种抽象。..

2022-08-28 17:48:37 1321

原创 K8s的Service详细解析

在kubernetes中,pod是应用程序的载体,我们可以通过pod的ip来访问应用程序,但是pod的ip地址不是固定的,这也就意味着不方便直接采用pod的ip对服务进行访问。为了解决这个问题,kubernetes提供了Service资源,Service会对提供同一个服务的多个pod进行聚合,并且提供一个统一的入口地址。通过访问Service的入口地址就能访问到后面的pod服务。......

2022-08-28 14:31:49 604

原创 K8s的Pod控制器详细解析

自主式pod:kubernetes直接创建出来的Pod,这种pod删除后就没有了,也不会重建控制器创建的pod:kubernetes通过控制器创建的pod,这种pod删除了之后还会自动重建什么是Pod控制器Pod控制器是管理pod的中间层,使用Pod控制器之后,只需要告诉Pod控制器,想要多少个什么样的Pod就可以了,它会创建出满足条件的Pod并确保每一个Pod资源处于用户期望的目标状态。如果Pod资源在运行中出现故障,它会基于指定策略重新编排Pod。...

2022-08-28 12:19:23 398

17J_Localization of sound sources in robotics A review_麦克风阵列声源测向入门综述.pdf

基于麦克风的声源定位在机器人中的应用综述

2019-09-01

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除