自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(419)
  • 资源 (9)
  • 论坛 (1)
  • 收藏
  • 关注

原创 网易云对象存储 HTTP 文件上传

网易数帆的对象存储服务不错,企业用户免费,可以绑定 https 域名等等。官方提供了 SDK 调用对象存储的各种服务,是挺好的挺方便的,不过就是 SDK 依赖臃肿,本人不是很待见,于是改用其 HTTP 接口来简单完成文件上传的服务,可以说是折腾了一把。本文采用 Java 语言完成。生成授权信息为鉴别授权,必须在 HTTP 请求头中包含 Authorization 字段,该字段就是授权信息,必须验证遵守其 API 生成授权信息,否则不能访问其服务(只能匿名地部分访问)。生成方法如下(参考了官方文档)。A

2020-09-10 09:54:00 133

原创 简单实现 Bean 字段校验

关于 Bean 字段校验,我之前曾用 Apache BVal 探讨过,现在连这货都不想用,少一个依赖是一个。自己做,若完全按照 JSR 303 规范来实现会非常麻烦,没有那个必要。于是取舍一下,还是沿用 JSR 303 的注解作为约束条件,参考这位仁兄的基于反射的做法,自己实现一套 Bean 校验。原理总的来说是,反射+自定义函数接口(Java 8)+Map 关联注解与验证实现,比较简单,顶多 100 行代码搞定,都是本着咱够用就行的要求,其他的不想 BB 那么多,要是真有问题,到时再说。首先写个单测,

2020-08-01 00:02:13 165

原创 AJAXJS MVC 使用教程之五:过滤器

过滤器的主要目的是拦截每次请求之前和之后的一些操作。有别于 Servlet 标准过滤器,这是 MVC 框架中重写的过滤器。为简化概念,框架中不单独另设 AOP 机制,但可把过滤器当作 AOP 的代替品。其发挥如下作用:初始化数据库连接、日志记录、权限校验等等。如下例子中注解 @MvcFilter 引入了数据库连接过滤器 DataBaseFilter,通过过滤器before()方法在list()执行之前调用了数据库连接的逻辑。除此之外,@Authority也是过滤器注解,引入 PrivilegeFilter

2020-07-30 17:33:04 101

原创 AJAXJS MVC 使用教程之四:模板和返回响应数据

控制器处理完业务后会返回结果数据给前端:要么在前后端分离的情况下直接返回 JSON 数据,无须经过视图层;要么返回 HTML 则要在 View 层进行转化。输出 HTMLAJAXJS Web 提供中介媒介 ModelAndView 对象,用于存储页面所要显示的数据。在控制器方法中加入 ModelAndView 参数即可,它本身就是 HashMap 的子类。以下例子是输出不同类似的数据到页面中。package com.demo.mvc;import java.util.ArrayList;im

2020-07-30 17:30:49 97

原创 AJAXJS MVC 使用教程之三:处理请求参数

请求参数出现的地方将变成控制器的方法的输入参数,即每个 Java 参数映射着 HTTP 请求参数;然后控制器方法执行后返回的结果就是响应客户端的结果。原生请求响应对象原生对象指的是 HttpServletRequest、HttpServletResponse 这类由 Servlet 提供的接口。只要方法定义了这些接口的参数,即可送入,不管参数名具体如何。请看下面的例子。@GETpublic String get(HttpServletRequest request, HttpServletRespo

2020-07-30 17:28:59 96

原创 AJAXJS MVC 使用教程之二:定义路由路径

写一个控制器很简单,但有下面注意的事项需要遵守的。每个控制器类必须要实现IController接口,才能表明为控制器组件,否则不被视为控制器。至少要一个@Path路径的注解定义在类声明上。控制器的类名推荐以Controller结尾,比如ApplicationController, HelloController等。控制器必须在配置site_config.json指定的System.scanPackage包名之中,也就是上述定义搜索的包名,否则不能登记该控制器。可以多个URL绑定对应一个控制器类

2020-07-28 10:48:50 104

原创 AJAXJS MVC 使用教程之一:创建第一个 Hello World! 路由控制器

我们利用MVC来建立一个Hello World!的Web应用程序1。首先在项目pom.xml添加ajaxjs-web的JAR包依赖。<dependency> <groupId>com.ajaxjs</groupId> <artifactId>ajaxjs-web</artifactId> <version>1.2.0</version></dependency>把多个路由封装起来的

2020-07-27 23:57:57 114

转载 OO之美:好代码和坏代码

本节将介绍以下内容:编码的规范面向对象指导引言好的代码,是练出来的。坏的代码,是惯出来的。那么,代码是写给计算机的吗?不是,代码其实是写给人的。Martin Fowler说:任何一个傻瓜都可以写出计算机可以理解的代码。唯有写出人类容易理解的代码,才是优秀程序员。那么,本文要探讨的其实是写出给人看的好代码,不涉及具体的代码技巧,只关注泛化的代码实践,通过一系列条款来过滤应该关注的好代码和坏代码。好代码、坏代码命名很重要,让代码告诉你它自己命名到底有多重要呢?重要到这几乎是很多软件项目成

2020-07-27 19:53:00 134 2

转载 OO之美:面向对象和基于对象

本节将介绍以下内容:基于对象的澄清面向对象的差别引言这是一个常常被问起的话题,对于面向对象(Object-Oriented)我们可能有清晰的概念,对于基于对象(Object-Based)我们可能有模糊的认知,而对于二者一词之差的细节,又有多少概念值得深究呢?关于面向对象的论述,本书第1章“OO的智慧”已经有相对全面的介绍,对于继承、封装和多态这些基本要素,已经有了较为深入浅出的了解,基于如此背景,就先从关注基于对象开始。基于对象所谓基于对象,就是一种对数据类型的抽象,封装一个结构包含了数据

2020-07-27 19:43:51 77

转载 OO之美:依赖的哲学

依赖的哲学本节将介绍以下内容:关于依赖和耦合面向抽象编程依赖倒置原则控制反转依赖注入工厂模式Unity框架应用引言“不要调用我们,我们会调用你”是对DIP最形象的诠释。作为5大设计原则之一的DIP原则,有了2.4节“依赖倒置原则”由概念而实例的单纯讨论,还不能全面阐释清楚:什么是依赖倒置?为什么依赖倒置?如何依赖倒置?这几个关键的问题,不单纯地通过DIP而DIP,而是从依赖这个最原始的概念讲起,来了解在面向对象软件设计体系中,关于“关系的处理”,也就是“依赖的哲学”。对,

2020-07-27 19:19:02 119

转载 OO 之美:设计的分寸

本节将介绍以下内容:设计的由来浅谈重构设计的分寸引言有了前面两章“OO 大智慧”和“OO 大原则”的铺垫,相信读者已经有了对面向对象的基本认知。而本章将继续深入关于面向对象和设计问题的讨论,挑起设计与架构的话题。在高级语言横行的今天,对于静态语言的设计都源于面向对象思想,重构与设计都基于这些简单的标准。然而,对于设计,还有很多看似“惯常”的法则与经验广泛存在于软件系统中,例如除了经典的 23 种设计模式,还有很多模式之外的模式,按照粒度的大小、系统的特点、规模的大小,而形成的架构规则。对

2020-07-27 18:06:40 88

转载 解耦设计手法小结

设计是一个平衡的产物,需要在各个约束条件下(组织目标,业务目标,开发流程,技术能力,学习及维护成本等)不断地进行演进。 我们虽然不提倡做大而全的设计,但会坚持进行基础性设计,以保证我们的设计一直在正确的方向上演进。设计演进的过程既可以是自上而下的,也可以是自下而上的。基本设计原则业界普遍被接受的设计原则不再赘述。这里特别针对基于开源项目的软件,其总体主旋律将是:跟随,扩展,贡献,其中跟随将是一个基本能力,反观深度定制的方式会遭遇越来越多的尴尬。落实在设计上,其最核心的设计原则:隔离自有业务。相较于模块

2020-07-27 15:13:22 74

转载 JDBC和数据库事务详解

现在还在写 JDBC 事务的文章,我觉得我一定是相当的 Out 了,现在主流的 java 应用,框架都是分布式的,各种分布式的事务,或者容器事务才是需要学习的重点,在这里谈 JDBC 确实有点不合时宜,但任何的 java 开发人员,如果不能够深入的理解数据库的事务,那在做数据处理的方面就一定是有所欠缺的,另外确实很少有文章能够谈到 JDBC 和数据库事务的精髓,希望这里能够让你深度的了解到什么是 JDBC 的事务以及它和数据库的关系。事务事务应该说是数据库最核心的能力之一,对于任何和数据打交道的开发人员

2020-07-27 12:15:12 92

转载 支付系统经验谈

支付系统各接口总结接口:同步调用, 重试调用(框架自动重试),自己定时任务自动重试、主动查询、主动查询后自动重试,异步回调,对账,网关层处理对后续逻辑。定时关闭正常支付:正常获取支付签名.重试调用(框架自动重试): 支付宝普通支付不交互,支付宝app支付交互可重试,微信支付交互,可重试,返回新的可用的预支付id.定时任务自动重试,无.主动查询:回调延迟, 需要客户端协作,把支付成功的回调通知回来.定时任务主动查询这些.主动查询后重试,无必要.异步回调. 只有成功回

2020-07-27 11:52:45 101

转载 自然而然的设计

设计,似乎有点高深莫测! 一堆的模式、模型,让人无所适从。学了记不住,记住又用不上。我觉得设计应当是自然而然的事,从实际问题出发找出实际的解决方案就可以了。其实难点在于能不能看到问题。回想起 12 年前的 2000 年,当时刚进入一家 ERP 公司,被安排为一家灯饰公司"客制"(所谓客制就是定制的意思!)人事系统。当时系统总被客户抱怨薪资结算太慢,四千人的工资要跑一晚上。下班时开始结算,第二天看结果。刚上系统,难免出现数据遗漏,那又要重算一遍。好在那个时代对软件有些迷信,这边说没办法,系统架构所致,客户也

2020-07-27 11:31:34 113

转载 用 Java 8 lambda 优化 JDBC

首先创建一个函数接口 ResultSetProcessor :@FunctionalInterfacepublic interface ResultSetProcessor { public void process(ResultSet resultSet, long currentRow) throws SQLException;}下面做个简单查询案例,使用这个接口遍历public static void select(Connection connection, String sql

2020-07-27 10:33:48 94

原创 权限设计算法基础

权限管理在一个系统中是不可或缺的,总的来说还是一个数学的问题。最笨的方法之前这个系统的权限管理是通过配置文件来处理的,大概流程是这样的,把用户分成多个用户组,然后每个用户组对应着多个用户的 id,每次访问页面的时候,都会读取这个配置文件的信息,判断登录用户的 id 属于哪个用户组,然后在页面判断这个用户组是否有访问这个链接的权限。配置文件的格式是这样的:{"adm" : [1,2,34], "dev" : [5,6,1]}这样会带来什么问题呢?有以下几个:权限管理混乱,一个用户 id 可能会在多个权

2020-07-23 10:25:41 211 1

原创 聊聊数据库表结构设计心得

本文讨论是一般表的设计,有一定的普遍性和通用性,当然对于特殊性的考量则不在本文讨论之列。自增 idJava 层的 CRUD 都是围绕自增 id 的,以这个 id 为依据的,所以自增 id 不可或缺,每张表都应该有。当然其他类型的 id,如 uuid、雪花 id 都可以并存。还有分页、表与表的关联都离不开这个自增 id。createDate & updateDate有了这两个字段,你可以追溯到数据的时间点,创建和修改的时间点,以方便查找问题。MySQL 下类型为 datetime,在 Ser

2020-07-22 12:09:03 2106 8

原创 六行代码写个 Tab 控件

其实之前的方法都不是太聪明(例如我写过的《Vue Tab 组件再探究》),个人认为这种方法,区区六行代码,搞定!changeTab = function(e) { var old = aj('.show'); old.classList.remove('show'); old.classList.add('hide'); var el = aj('.config-tab-' + e.selectedIndex); el.classList.remove('hide'); el.classL

2020-07-18 22:33:25 126

原创 Java Web 实现 HTTP Basic 认证

Basic 认证是一种较为简单的 HTTP 认证方式,客户端通过明文(Base64 编码格式)传输用户名和密码到服务端进行认证,通常需要配合 HTTPS 来保证信息传输的安全。界面如下。下面基于 Servlet 标准 Filter 实现一个 HTTP Basic 登录机制,可以用作测试时的临时发布用。部分函数利用了 AJAXJS 库。package com.ajaxjs.web;import java.io.IOException;import javax.servlet.Filter;im

2020-07-03 16:44:55 341

转载 部署时决定-插件机制

什么是插件如果我们的项目依赖了一个接口,但是我们在开发时,真的没办法确定,部署的时候,到底采用哪个实现。比如 Nutz 的 Log。 它在运行时,会判读当前运行环境 log4j 是否可用(有 log4j 的org.apache.log4j.Logger类), 如果没有,那么它就把日志信息输出到控制台上。它的实现,就是依靠的方式。但是,同复杂强大的 OSGI 插件体系不同,这里的插件只是强调,在部署时决定采用什么实现。在运行时,它是没 办法更改的。因此 Nutz 虽然在编译时依赖了 Log4j,但是在运行时

2020-06-29 12:47:17 172

原创 调用百度统计 API

百度统计为用户提供了 API 接入的方式,使得用户可以自定义 UI 而无须进入百度统计网站。百度统计存在两种账号体系:百度商业账号和百度账号,前者就是统计早期的用户账号,本文基于百度商业账号,说明如何接入统计 API。

2020-06-27 01:04:40 1026 3

原创 JSP 导出 Excel 格式备忘

兼容 Excel 和 Libre Office Calc 的单元格“文本”设置<td style="mso-number-format:'/@';" sdnum="2052;0;@">${item.id}</td>

2020-06-01 18:12:46 213

原创 微博、QQ、微信第三方登录 Java 实现实录

第三方账号登录流程"首先, 每个第三方账号(QQ/微博/微信等)都有产生一个唯一性的 openID, 首次登录是这个 openID, 第二次登录也是这个 openID,每次登录都是这个不会变的,所以,基于这种特性我们可以让这些第三方账号首次登录时, 进行的是(注册–自动登录)这两个过程, 把它 openID 当成一个字段存入数据库中,之后的每次登录都先进行判断下,若存在该 openID,...

2020-05-31 11:32:28 823

原创 简简单单做一个带过期时间的内存缓存

做手机验证码的时候,一般都有五分钟或十分钟的限时机制,所以就需要把“号码–验证码”的信息暂存起来,过期便无效——类似于 Redis 自带过期的机制就适合了。不过应用 Redis 此类缓存模块要专门搭建环境和配置——比较繁琐,于是想到用 JVM 的缓存来做。关键地,我参考了该资源:https://blog.csdn.net/wab719591157/article/details/78029861并在这个基础上重写一遍,主要是改造为我自己的编码风格(例如泛型的处理,函数式 Lambda 代替 Inte

2020-05-25 00:49:55 485

原创 Java 压缩/混淆 JavaScript 代码

基本上都是自己写的工具构建前端工程,压缩/混淆 JavaScript 代码的工具必不可少。我们是 Java 平台的,就是说用 Java 去压缩 JS,这样比较方便。虽然咱们可以外部调用 node 等专门的前端构建工具,但那样不省事,能在 Java 圈子里面搞定就行,我们不搞太复杂的。好~闲话不多说,先看看低配版的。低配版这个低配版就几个函数组成,没以前来其他第三方的包,故称为“低配版”。简单实用也可以,我也用了很久。/** * This file is part of the Echo Web Ap

2020-05-10 19:35:19 461

原创 Istio 可以代替 Spring Cloud 吗?

背景过去,我们运维着“能做一切”的大型单体应用程序。 这是一种将产品推向市场的很好的方式,因为刚开始我们也只需要让我们的第一个应用上线。而且我们总是可以回头再来改进它的。部署一个大应用总是比构建和部署多个小块要容易。集中式:分布式:集群分布式和集中式会配合使用。我们在搭建网站的时候,为了及时响应用户的请求,尤其是高并发请求的时候,我们需要搭建分布式集群来处理请求。我们一个服务器的...

2020-04-06 15:32:47 4455 1

原创 一台 VPS 主机运行多个网站,多个 HTTPS 域名(基于 nodejs)

四年前写过一篇《用 nodejs 做反向代理服务器》,那时基于 HTTP 的,时过境迁,HTTPS 已是主流。怎么把 HTTP 升级到 SSL 呢?这里为大家稍作介绍一下,作法稍有不同。支持 SSL首先 nodejs 支持 HTTPS 很简单,只需要把 require(‘http’) 变为 require(‘https’),然后导入证书文件即可,当然也要把监听端口 80 变为 443。...

2020-03-28 23:39:08 2352 2

原创 Java 中国大陆身份证处理

开发过程中有涉及身份证的业务,首先是对身份证号码合法性的校验。我们先看看一个简单的版本,出处是 https://blog.csdn.net/ZWLJavaWeb/article/details/55047332。简单检测/** * 快速检测 * * @author https://blog.csdn.net/ZWLJavaWeb/article/details/55047332...

2020-03-27 14:55:38 532 6

原创 巧用 ServletOutputStream 制作代码生成器

代码生成器(CodeGenerators)能够极大地提高工作效率。我们知道,模板技术推崇一种模式:输出=模板+数据。代码生成器的原理也可以同样如是,这里不妨借鉴 JSP 生成的思路,页面 HTML 换成 Java 语句,成为固定不变的内容,即是“模板”;数据就是动态获取的内容,即实体信息和数据库的表字段等信息。生成过程和标准 Servlet 的 MVC 模式没什么不同,只是自定义其中的 Servl...

2020-03-25 00:21:26 459 1

原创 常见网络安全攻击分析

本文所述的常规性防御问题包括 XSS 攻击、 SQL 注入、CSRF 攻击、CRLF 注入,下面就逐一来分析这四种问题。跨站脚本攻击 XSS跨站脚本攻击(Cross Site Script,XSS,单词 Cross 可作“X”)是 Web 常见攻击的类型。同一域下面资源可以自由相互访问;不同域下面的资源,浏览器是会严格限制的。访问不同域称作“跨域”或“跨站”。如果主机名不相同(即使 a.qq....

2020-03-23 21:09:28 716

原创 Vue Tab 组件再探究

初学 Vue 的时候,发现用 Vue 来写 Tab 组件是如此简单,利用“数据驱动”的思路还真和 js 控制 dom 不一样。请见下面第一版的代码,没有 js dom 那样 for 遍历各元素控制显示或隐藏,而是用 {‘selected’: index === selected} 控制样式,非常简洁。第一版的 tab 组件// 简单选项卡Vue.component('aj-simple-ta...

2020-03-22 23:00:46 969

原创 Java 处理 JSON 标准规范

某日我瞎逛 Github,咦~发现 JSON 处理也有 javax,import javax.json.Json;import javax.json.JsonArrayBuilder;import javax.json.JsonNumber;import javax.json.JsonObject;import javax.json.JsonObjectBuilder;import j...

2020-03-05 15:45:17 311

原创 用 WebSocket + Java 原生功能实现 Web 实时日志(兼容Win平台)

Tomcat产生的日志以文件形式保存在服务器上。如果要在 Web 上浏览这些日志,采用 WebSocket + tail 命令是简单可行的方式,例如这文章介绍得都很好。只是在 Win 系统上面就没有类似 tail 命令行的工具,除非找第三方或者 PowerShell 的,多少有点不便,——尽管多数 Win 用于开发环境,日志直接在 IDE 控制台上看就可以了。这里为大家介绍的是一种原生 Java ...

2020-02-20 16:15:36 613

原创 Java8 Zip 压缩与解压缩

网上找过几个例子都有点小问题,还是谷歌找出来的靠谱。主要是增加了指定文件的功能,通过 Java8 的 Lambda 判断是否加入 ZIP 压缩,比较方便。函数表达式的签名是 Function<File, Boolean>,参数是待加入的 File 对象,返回值 true 表示允许,反之不行。完整代码在:https://gitee.com/sp42_admin/ajaxjs/blob/...

2020-02-16 23:22:57 1915

原创 免 mysqldump 命令备份 MySQL 数据库

使用官方提供的 mysqldump 命令可以轻松地备份SQL,但是通常应用服务器和数据库服务器不是放在一块的儿,是否可以通过纯 Java 或 JDBC 来实现备份呢?答案是可以的,笔者根据此思路进行了与 AJAJX-Data 的整合,代码行数更精简,只有 200 多行代码。但是,必须指出,这种思路有不少缺点,自然是不能代替官方工具的了。备份表结构通过 SHOW CREATE TABLE 语句完成...

2020-02-10 17:01:19 450

原创 H5 动画大师 TweenMax.js/GSAP

手写过 CSS3 做 H5 动画,那过程很累,很低级。于是这次改用 TweenMax 库,感觉非常不错,原来它是做动画的老行尊,失敬失敬,早在 Adobe Flash 时代,这款就是知名的类库,知道现在还可以在其 GitHub 上找到它的 ActionScript 2/3 的开源代码,怪不得现在转到 JS 上面来,都那么的成熟。官网:https://greensock.com/源码:http...

2019-12-06 17:42:27 449

原创 GoldenDict:一款免费的词典工具

开源软件 GoldenDict 是一款“词典”管理软件。为什么称之为“词典”管理软件呢?因为准确地说,GoldenDict 它本身并没有提供任何的“词典”,而是仅提供词典所需的各方面功能,好比一些词典常见的功能也包含在内,即普通查询单词和屏幕截取单词、单词发音三大功能。GoldenDict 的界面非常朴素,并且 GoldenDict 不以大而全的功能为目标,而是经典功能、实用至上为出发点,可以说就...

2019-10-29 15:26:48 14979 1

翻译 9月Libra开发人员更新-路线图#1

9月Libra开发人员更新-路线图#1 September Libra Developer Update - Roadmap #1October 02, 2019Libra Association自六月份正式发布 Libra 项目以来,来自开发人员社区的反响一直非常令人激动。开发者已发布了多个区块链浏览器(libranaut,libraview,librabrowser 和 libex...

2019-10-09 12:15:59 281

翻译 Libra 开发者采风

Libra Developer SpotlightSeptember 12, 2019Michael Engle, Libra Association我们很高兴看到全球各地有如此众多的开发者率先在 Libra 测试网上进行创新的工作。这里就把那些有亮点的例子分享出来!We’re so excited to see so many leading developers from ar...

2019-10-07 09:39:57 406

商城测试用图片.7z

商城测试用图片,有各种规格,用 7zip压缩。这份是根据电商中所涉及的业务点整理出的图片,更多的偏向于产品功能性的测试。其后所涉及到的性能测试、压力测试、集成测试等,会在进一步分析,作为一名产品经理应该了解到这部分图片。

2020-02-16

Firefox Setup 56.0.2.exe

老版本的Firefox 支持旧插件的最后一个版本,注意安装后立刻断网,禁止自动更新

2019-08-12

DB Browser for SQLite.zip

DB Browser for SQLite 是一款 Sqlite 数据库编辑器,用户通过软件能够非常方便快捷的创建以及查看数据库。开源免费!

2019-08-12

HDTunePro 5(Win8修正版).zip

HD Tune Pro硬盘检测工具是一款小巧易用的硬盘工具软件,其主要功能有硬盘传输速率检测,健康状态检测,温度检测及磁盘表面扫描等。解决 Win8 边框问题,不会过期,好用!

2019-08-12

JDK JavaScript 独立运行时 Nashorn,Java 7 可用

JDK JavaScript 独立运行时 Nashorn,Java 7 可用。比 Rhino 更快,更好用

2016-01-10

数据库转换神器 ESF Database Migration Toolkit - Professional

数据库转换神器 ESF Database Migration Toolkit - Professional

2015-11-25

技术作家林信良博客精华 PDF

本人收集林大大的博客文章,放在一起了。特别是函数式的比较关注

2015-10-21

ASP 空间探针(JScript 写的)

ASP 空间探针(JScript 写的),作者:cocoon sTudio. 2002/12/12

2015-10-13

Ext JS 3.1~3.3 API中文文档(CHM格式)

Ext JS 3.1~3.3 API中文文档(CHM格式) 比较完整的版本。

2010-09-05

sp42a的留言板

发表于 2020-01-02 最后回复 2020-01-02

空空如也

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

TA关注的人 TA的粉丝

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