- 博客(2492)
- 资源 (32)
- 收藏
- 关注
转载 从原理到实践:MDC日志链路追踪指南
MDC是日志框架(如 SLF4J、Logback、Log4j2)提供的一个线程绑定的上下文存储机制,用于在日志中附加额外的上下文信息(如请求 ID、用户 ID、链路追踪 ID 等)。它是一个在日志框架中使用的工具,主要用于在多线程环境中追踪和诊断日志。MDC允许开发人员在日志记录中关联特定线程的上下文信息,例如用户ID、请求ID、会话ID等,以便在日志中更方便地进行追踪和定位问题。
2025-07-29 08:49:43
转载 Redis + MQ:高并发秒杀的技术方案与实现
在电商秒杀场景中,瞬间爆发的海量请求往往成为系统的生死考验。当并发量达到数万甚至数十万QPS时,传统数据库单表架构难以支撑,而Redis与消息队列(MQ)的组合凭借其高性能与可靠性,成为应对高并发秒杀的黄金方案。Redis + MQ方案通过预扣减 + 事务消息 + 对账Redis承担高并发读写,通过Lua脚本确保原子性,防止超卖;MQ事务消息保障Redis与MySQL的最终一致性,避免数据断层;流水对账作为最后一道防线,及时发现并修复异常。
2025-07-22 09:05:40
16
转载 Spring Boot 接口安全设计:接口限流、防重放攻击与签名验证实战
在当今互联网应用开发中,接口安全至关重要。对于项目而言,保障接口不被恶意调用、数据不被篡改、请求不被重放,是后端开发者必须攻克的安全难题。本文将深入探讨如何设计并实现一套安全、通用、可落地的接口安全方案,涵盖接口限流、防重放攻击与签名验证等关键技术。提供接口文档和签名规则:服务提供方编写详细的接口文档,明确接口的功能、请求参数、响应格式以及签名规则,包括所需的公共参数()、签名算法、appSecret的获取方式等,提供给调用方。
2025-07-22 09:04:38
23
转载 SpringBoot+ResponseBodyEmitter异步流式推送神技,非常强大!
ResponseBodyEmitter 就像 Spring Boot 送给 Java 开发者的一件神器,它让我们能够轻松实现高效的异步流式推送。通过本文的学习,你应该已经掌握了以下核心技能:理解异步流式推送的必要性和应用场景掌握 ResponseBodyEmitter 的核心方法和使用技巧学会与其他技术的对比分析和选型策略了解常见问题的解决方案和性能优化技巧最后,我想说的是,技术的价值不在于它有多复杂,而在于它能解决什么问题。
2025-07-21 09:08:16
31
转载 同步 vs 异步性能差10倍!SpringBoot 高吞吐接口实现终极方案
同步编程就像绿皮火车,虽然稳定但速度慢;而异步编程则是高铁,能在高并发场景下轻松 “飙车”。通过 Spring Boot 的异步实现、线程池调优、WebFlux 响应式编程和数据库优化,你完全可以打造出吞吐量提升 10 倍的高性能接口。
2025-07-18 10:30:00
29
转载 SpringBoot 实现 RAS+AES 自动接口解密
目前常用的加密方式就对称性加密和非对称性加密,加密解密的操作的肯定是大家知道的,最重要的使用什么加密解密方式,制定什么样的加密策略;作为可逆且对称的块加密,AES加密算法的速度比公钥加密等加密算法快很多,在很多场合都需要AES对称加密,但是要求加密端和解密端双方都使用相同的密钥是AES算法的主要缺点之一。为了接口安全我,我和前端约定了传递参数是:用户无限模式的积分+“我们约定的一个数字”+用户id的和,在用Base64加密,请求到服务器我再解密,出用户无限模式的积分;非对称加密算法是一种密钥的保密方法。
2025-07-16 08:56:07
40
转载 SpringBoot + EasyExcel进阶:如何用多线程+Zip压缩实现百万数据导出“零卡顿”?
在 SpringBoot 开发中,传统的同步 Excel 导出方式会导致服务阻塞,直到文件生成完毕,对于大量数据导出,效率低下且用户体验差。本方案通过分拆数据、利用 CompletableFuture 异步并行处理,结合 EasyExcel 导出多个 Excel 文件,最后压缩成 ZIP 文件供用户下载,实现高效且流畅的大量数据导出。
2025-07-16 08:54:28
30
转载 不好意思,HttpClient 可以考虑换了!
基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能。基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能。默认的全局调用适配器工厂是。
2025-06-28 13:40:08
77
转载 聊聊 SSE:让服务器“主动开口说话”的通信方式
轮询:你点了菜之后,每隔一会儿就跑去问服务员:“我的菜好了没?SSE:你点了菜,安心坐着。饭做好了,服务员主动来告诉你:“上菜啦!WebSocket:你和服务员之间装了个对讲机,随时可以互相说话。SSE(Server-Sent Events)是一种基于HTTP的单向通信协议,允许服务器主动向浏览器推送数据。它就像一根从服务器连到浏览器的“数据水管”,打开后服务器可以随时通过这根管子“浇水”(推送数据)。核心特点✅单向通信:服务器 → 浏览器(像广播电台)✅基于HTTP:无需特殊协议✅自动重连。
2025-06-22 18:35:11
332
转载 Server-Sent Events (SSE) 技术解析与实战
Server-Sent Events (SSE) 是 HTML5 标准的一部分,允许服务器主动向客户端推送数据。它基于 HTTP 协议,使用简单的文本格式传输数据。Server-Sent Events (SSE) 是基于 HTTP 的服务端推送技术,特别适合 AI 聊天、实时通知等单向数据流场景。本文介绍了 SSE 的基本数据格式,断线重连及数据续传功能。
2025-06-22 18:34:33
77
转载 说下10个高级的 SQL 查询技巧
如果您注意到,CTE很有用,因为您可以将代码分解为较小的块,但它们也很有用,因为它允许您为每个CTE分配变量名称(即toronto_ppl和avg_female_salary)递归CTE是引用自己的CTE,就像Python中的递归函数一样。递归CTE尤其有用,它涉及查询组织结构图,文件系统,网页之间的链接图等的分层数据,尤其有用。示例问题:给定下面的员工表,写出一个SQL查询,了解员工的工资,这些员工比其管理人员工资更多。Rank()返回从1开始的每行的唯一编号,除了有关系时,等级()将分配相同的数字。
2025-06-13 09:05:37
79
转载 OKHttp 使用 SSE
/ 使用EventSourceListener处理来自服务器的SSE事件。最近做项目需要接入ai会话流式输出的效果采用springboot3+OKHttp。log.error("推送数据失败", e);// JSON 参数配置。Controller代码。
2025-06-13 09:04:59
179
转载 SpringBoot的5种签到打卡实现方案
在现代应用开发中,签到打卡功能广泛应用于企业考勤管理、在线教育、社区运营等多个领域。它不仅是一种记录用户行为的方式,也是提升用户粘性和活跃度的重要手段。本文将介绍5种签到打卡的实现方案。最直接的签到系统实现方式是利用关系型数据库(如MySQL、PostgreSQL)记录每次签到行为。这种方案设计简单,易于理解和实现,适合大多数中小型应用场景。1.3 核心代码实现实体类设计Mapper层Service层Controller层1.4 优缺点分析优点:• 设计简单直观,易于理
2025-06-13 09:04:25
44
转载 《优化接口设计的思路》系列:第七篇—接口限流策略
大家好!我是sum墨,一个一线的底层码农,平时喜欢研究和思考一些技术相关的问题并整理成文,限于本人水平,如果文章和代码有表述不当之处,还请不吝赐教。作为一名从业已达六年的老码农,我的工作主要是开发后端Java业务系统,包括各种管理后台和小程序等。在这些项目中,我设计过单/多租户体系系统,对接过许多开放平台,也搞过消息中心这类较为复杂的应用,但幸运的是,我至今还没有遇到过线上系统由于代码崩溃导致资损的情况。这其中的原因有三点:一是业务系统本身并不复杂;
2025-06-05 16:52:20
37
转载 SpringBoot 接口防抖(防重复提交)的一些实现方案
在Web系统中,表单提交是一个非常常见的功能,如果不加控制,容易因为用户的误操作或网络延迟导致同一请求被发送多次,进而生成重复的数据记录。key分隔符是用来将多个参数合并在一起的,比如userName是张三,userPhone是123456,那么完整的key就是"张三&123456",最后再加上redis锁前缀,就组成了一个唯一key。从测试的结果上看,防抖是做到了,但是随着缓存消失、锁失效,还是可以发起同样的请求,所以要真正做到接口幂等性,还需要业务代码的判断、设置数据库表的UK索引等操作。
2025-06-05 16:36:58
37
转载 SpringBoot接口安全设计:接口限流、防重放攻击与签名验证实战(附源码)
在对外开放接口的过程中,如何确保接口不被恶意调用、数据不被篡改、请求不被重放,是每一个后端开发者都绕不过去的安全难题。尤其是在企业级对接中,签名校验机制已经成为“标配”。今天我们就以一个 Spring Boot 项目为例,带大家深入了解如何设计并实现一套安全、通用、可落地的接口签名校验方案。需要源码的,文末有源码的获取方式。,时长03:28一、为什么需要签名机制?签名机制的本质是“你说你是你,那你得证明一下”。:攻击者伪造请求,不断调用接口,拖垮服务器;:中间人修改了请求内容;
2025-05-26 11:40:05
132
2
转载 Java实现10万,并发去重,优雅地处理重复请求!
对于一些用户请求,在某些情况下是可能重复发送的,如果是查询类操作并无大碍,但其中有些是涉及写入操作的,一旦重复了,可能会导致很严重的后果,例如交易的接口如果重复请求可能会重复下单。重复的场景有可能是:黑客拦截了请求,重放前端/客户端因为某些原因请求重复发送了,或者用户在很短的时间内重复点击网关重发….本文讨论的是如何在服务端优雅地统一处理这种情况,如何禁止用户重复点击等客户端操作不在本文的讨论范畴。利用唯一请求编号去重可能会想到的是,只要请求有唯一的请求编号,那么就能借用Redis做这个去重——只要这个唯一
2025-05-22 13:45:33
59
转载 MybatisPlus 不香了?小哥自研 Pro 版,效率翻十倍!
具体来说,该类中包含了五个基本HTTP操作(POST, GET),通过不同参数和请求方式对实体对象进行CRUD操作,即添加(insert)、删除(delete)、修改(update)、查询(getById)、存储(save)、列表查询(list)、分页查询(page)、统计数量(count)。需要注意的是,该控制器只是一个模板,实际使用时需要继承该控制器并传入相应的Service类作为泛型S的参数,并实现具体的CRUD方法。类,就可以拥有增删改查,查询列表,分页查询,排序,带参数查询,统计数量。
2025-05-22 13:44:59
115
转载 写了一个mybatis-generator-ui,各种代码自动生成,开源
这个项目是几年前无聊的时候写的,基本上就是借助Mybatis-generator的自动生成功能,做成了可视化的。可以自定义项目,模板和代码生成规则,个人用用还是挺香的,包括我自己做项目也会使用,确实能在一定程度上提升开发效率。如图,这样就导入成功了,系统会根据你的建表语句,自动去识别字段。系统会实时保存的,再转储SQL,可以看到最新的SQL。点击导入表,会从右侧弹出一个抽屉,能够看到所有的表。比如,我要在学生表新增一个状态,就点击新增一行。2025年05月14日 09:00。具体的自定义代码生成,直接看。
2025-05-19 08:31:32
88
转载 6个SpringBoot文件上传下载工具,从此告别“卡顿”和“超时”!!!
到这里,咱整了6种不同的文件上传下载工具,覆盖了从基础的本地存储到云端存储,再到高并发、大文件上传的场景。你要是做一个简单的上传功能,前面介绍的Spring Boot自带Multipart和OSS就能轻松搞定;如果你要做复杂的存储需求,MinIO可以为你提供分布式存储解决方案,给你带来高效且可控的存储体验。如果你做的是一个有较高并发或者大文件上传需求的系统,那就该考虑分片上传了,Nginx做反向代理,配合Spring Boot的高效上传策略,完美解决并发问题。
2025-05-19 08:31:01
170
转载 Java 文件处理:MultipartFile 与 File 互转
在Java Web开发中,和File是处理文件相关操作的重要类。主要用于接收客户端上传的文件,它封装了文件的相关信息和内容;File则代表本地文件系统中的文件或目录,用于对文件进行读写、删除等操作。在实际项目中,常常需要在和File之间进行转换,本文将详细介绍它们之间互转的原理、方法及应用场景。是Spring框架中定义的一个接口,位于包下。当客户端通过HTTP协议以格式上传文件时,Spring MVC会自动将上传的文件封装为对象。该接口提供了一系列方法来获取文件的相关信息,如文件名、文件大小。
2025-05-19 08:30:12
1535
转载 SpringBoot接口防抖(防重复提交)的一些实现方案
设置额外选项:过期时间和SET_IF_ABSENT选项”,有些同学可能不太清楚SET_IF_ABSENT是个啥,这里我解释一下:SET_IF_ABSENT是 RedisStringCommands.SetOption 枚举类中的一个选项,用于在执行 SET 命令时设置键值对的时候,如果键不存在则进行设置,如果键已经存在,则不进行设置。从测试的结果上看,防抖是做到了,但是随着缓存消失、锁失效,还是可以发起同样的请求,所以要真正做到接口幂等性,还需要业务代码的判断、设置数据库表的UK索引等操作。
2025-05-19 08:29:00
38
转载 Java Stream 高效开发!16 个案例,让你秒速起飞!
我们会通过16个案例详细的讲解有关Stream函数的应用。将每一个元素进行平方操作,最后返回一个新的集合。点击上方“程序员蜗牛g”,选择“设为星标”大厂程序员一枚 跟蜗牛一起 每天进步一点点。跟蜗牛哥一起,每天进步一点点。操作,如下计算1亿个数的求和。
2025-05-16 08:30:35
32
转载 基于防重表的通用接口幂等性设计方案
从系统架构视角看,幂等性需要解决的核心问题是"请求唯一性识别"和"状态一致性维护"。一、什么是接口幂等性?六、AOP的切面实现。
2025-05-16 08:30:00
29
转载 SpringBoot接口通用返回值设计与实现
手动包装每个返回值很麻烦,我们可以使用Spring的。:状态码,用于标识请求结果(成功/失败/特定错误):实际返回的业务数据,使用泛型支持不同类型。三、增加traceId有助于问题排查。:可读的消息,用于前端展示或调试。四、SpringBoot集成。一、一个简单的通用返回值。二、增加分页数据支持。
2025-05-16 08:29:19
87
转载 SpringBoot实现接口防刷的5种实现方案
接口防刷是一个系统性工程,需要考虑多方面因素:安全性、用户体验、性能开销和运维复杂度等。本文介绍的5种方案各有优缺点,可以根据实际需求灵活选择和组合。无论采用哪种方案,接口防刷都应该遵循以下原则:• 最小影响原则:尽量不影响正常用户的体验• 梯度防护原则:根据接口的重要程度采用不同强度的防护措施• 可监控原则:提供充分的监控和告警机制• 灵活调整原则:支持动态调整防护参数和策略通过合理实施接口防刷策略,可以有效提高系统的安全性和稳定性,为用户提供更好的服务体验。
2025-05-12 08:47:53
115
转载 HTTP/2 + SSE 能否完全替代 Websocket吗?
服务器发送事件 (SSE) 是一种标准化协议,允许 Web 服务器将数据推送到客户端而无需使用替代机制,例如: ping、长轮询 (Long Polling) 或 WebSocket。服务器发送事件(SSE)是 HTML5 公布的一种服务器向浏览器客户端发起数据传输的技术。一旦创建了初始连接,事件流将保持打开状态 直到客户端关闭。该技术通过传统的 HTTP 发送,并具有 WebSocket 缺乏的各种功能,例如:自动重新连接、 事件 ID 以及 发送任意事件 的能力。
2025-05-12 08:46:53
96
转载 1.8w字图解Java并发容器: CHM、ConcurrentLinkedQueue、7 种阻塞队列的使用场景和原理
/ node数组最大容量:2^30=1073741824// 默认初始值,必须是2的幕数//数组可能最大值,需要与toArray()相关方法关联//并发级别,遗留下来的,为兼容以前的版本// 负载因子// 链表转红黑树阀值,> 8 链表转换为红黑树//树转链表阀值,小于等于6(tranfer时,lc、hc=0两个计数器分别++记录原bin、新binTreeNode数量,<=UNTREEIFY_THRESHOLD 则untreeify(lo))
2025-05-12 08:45:41
39
转载 Spring Boot 各种回滚骚操作实战(自动回滚、手动回滚、部分回滚)
那么,在第一个事务中的两次读数据之间,由于第二个事务的修改,那么第一个事务两次读到的的数据可能是不一样的。每一条语句处于一个单独的事务中,在这条语句执行完毕时,如果执行成功则隐式的提交事务,如果执行失败则隐式的回滚事务。建立在AOP之上的。脏读就是指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。spring里事务是用注解配置的,当一个方法没有接口,单单只是一个内部方法时,事务的注解是不起作用的,需要回滚时就会报错。
2025-05-12 08:43:40
109
转载 别再造轮子了!Dify+MCP+DeepSeek开发实战保姆级教程,打造AI应用72变
之前分享过几篇关于MCP的文章,但都是在客户端中调用的,比如Cherry Studio,比如Cline,但它们都有一个共同的局限:当我在这些平台上调用MCP Server时,这些操作都仅限于我的本地环境,无法分享给他人,也无法在我们构建的Agent中使用。我们不再需要从零开始构建每一个功能,不再需要重复造轮子,而是可以像搭积木一样,将各种现成的能力组合起来,打造出千变万化的AI应用。1、点击右上角插件,选择从Marketplace中安装,搜索mcp,找到"MCP_SSE",点击安装。
2025-05-12 08:42:30
138
1
转载 Spring Boot 实战:SSE 实时通信方案设计与 WebSocket 深度对比
只需服务器到客户端的单向推送要求快速实现、低复杂性兼容现有 HTTP 基础设施(如认证、防火墙)
2025-05-05 15:30:42
154
转载 通用分页解决方案:简化项目开发中的分页难题
在实际项目开发过程中,分页功能的使用频率极高,尤其是针对不同数据表进行分页操作,往往是一件颇为繁琐的事情。不同的数据表结构、业务需求以及数据量大小,都可能导致分页实现方式的差异,这无疑增加了开发的复杂性和工作量。本文将分享一个通用分页解决方案,它能够对任意数据表实现分页,使用方法简单便捷,有效提升开发效率。
2025-04-24 08:11:55
48
转载 Spring Boot3+Vue2极速整合: 10分钟搭建DeepSeek AI对话系统
在生成式AI技术蓬勃发展的今天,大语言模型已成为企业智能化转型和个人效率提升的核心驱动力。作为国产大模型的优秀代表,DeepSeek凭借其卓越的中文语义理解能力和开发者友好的API生态,正在成为构建本土化AI应用的首选平台。本文将以Spring Boot3+Vue2全栈技术为基础,手把手带你打造一个具备以下特性的AI对话系统:实时流式对话交互体验;支持Markdown代码块/表格的专业级内容渲染;前端安全防护与响应式界面设计;高扩展性的API接入架构。
2025-04-22 08:53:42
127
转载 java对接Dify的聊天助手API(实战篇)
至此,后端已成功对接聊天对话的API,其他API操作同理,可以与前端快速的搭建AI对话聊天,基于知识库实现企业级需求!修改配置文件,由于Dify在本地部署,默认端口80与Dify冲突,否则造成服务不可用,所以修改为8080。前面的博客有讲到如何部署Dify以及简单使用,为了迎合企业级需求,快速搭建AI应用。目前idea版本2024.2,已成功破解,需要资料的可以加入技术群获取。测试该接口发现,需要认证信息,知道该怎么办了把,没错,启动前端!进入Dify的docker目录,cmd回车,执行如下命令。
2025-04-22 08:53:00
1555
1
转载 Dify解除上传文件大小15MB限制
在使用Dify的知识库时,文件上传大小不能超过15MB。步骤一:打开Dify文件docker目录下的.env文件。步骤二:停止Dify服务后,重启。调整参数大小后,点击保存。否则,会提示错误信息。
2025-04-22 08:51:37
1464
1
转载 接入SpringAI实现流式对话
本人正在打造技术交流群,欢迎志同道合的朋友一起探讨,一起努力,通过自己的努力,在技术岗位这条道路上走得更远。此次新增chatId字段,目的是为一次会话添加唯一标识,基于该标识存储会话记忆,目前使用的内存记忆功能,可以尝试使用向量数据库,永久有效。前面有讲到Python对接Deepseek实现对话,但基于现状,从事后端开发,侧重于Java,此次演示以SpringAI技术实现。此次基于SpringBoot工程演示,没有用到框架,一键启动,真方便。添加提示词功能,代码如下,重启后才可生效!步骤三:编写AI应用。
2025-04-22 08:50:45
189
转载 java对接Dify的工作流API(实战篇)
基于微服务架构的业务复杂度较高,在技术选型中我们采用Dify工作流来实现核心需求。Dify的工作流具备很多组件,大家可以根据需求灵活使用,此次演示为Demo,真实场景比这个要复杂哈。有些人就会问,Dify不是都实现了吗,为啥还要编写java代码去对接了,前端不是能对接python接口吗?前面的博客有讲到Dify工作流调接口查询数据以及调用Dify的聊天助手API,此博客需具备以上基础。测试文件上传,由于Demo版代码执行文件与工作流执行在一块,如果基于业务需求,中间会进行其他操作。步骤一:启动Dify。
2025-04-22 08:50:01
1965
2
转载 Dify应用实战(18) - 发布成MCP服务
今天学习了将Dify系统开发的AI应用变成可供其他工具或者系统调用的MCP服务,从而打通了系统之间的壁垒。你的Dify应用将会直接为你的助手类工具使用,或者集成到现有应用中,能扩展其AI能力。终于MCP相关的话题可以告一段落了。从MCP是什么,到怎么开发,然后是怎么使用MCP,最后是自己化为MCP。期望读者能顺着麦金叔的脉络,真正的把这些学会,并融会贯通投入到自己的项目中。
2025-04-22 08:49:21
413
转载 SpringBoot 使用 TraceId 日志链路追踪!
用途:每一次链路,线程维度,添加最终的链路 ID traceId.MDC(Mapped Diagnostic Context) 诊断上下文映射,是@Slf4j提供的一个支持动态打印日志信息的工具。/*** 日志拦截器*/@Override//可以考虑让客户端传入链路ID,但需保证一定的复杂度唯一性;如果没使用默认UUID自动生成if (!returntrue;@Override// 请求处理完成后,清除MDC中的traceId,以免造成内存泄漏/**
2025-04-22 08:48:02
74
转载 基于数据库锁实现防重复提交
在Web应用开发中,重复提交问题是一个常见的挑战。当用户由于网络延迟、误操作等原因,多次点击提交按钮时,可能会导致相同的数据被多次插入到数据库中,从而引发数据一致性问题。为了解决这个问题,我们可以采用token机制,大多数实现是基于Redis实现,今天介绍如何结合数据库的悲观锁或乐观锁来实现对请求的有效验证,确保同一操作不会被重复执行。通过使用token机制结合数据库的悲观锁或乐观锁,我们可以有效地避免用户重复提交请求,保证数据的一致性和系统的稳定性。
2025-04-12 12:03:13
58
interface使用
2011-02-06
新闻发布系统(jsp+ajax+oracle+java+javascript)
2011-07-10
航空订票系统(jsp+java+sqlserver+spring+servlet+strut)
2011-07-12
购物系统(shopping)用到的技术有(jsp+servlet+java+sqlerver+strut)
2011-07-09
springmvc+mybatis+mysql+log4j.xml+logjdbc+maven+nexus+dubbo
2017-05-10
springmvc+mybatis+mysql+log4jdbc+excel 实现sql日志输出和excel导出
2017-05-09
火车站售票系统.(java+oracle+jsp+javascript)
2011-07-09
网上书店系统(java+sqlserver+jsp+servlet+strut+spring)
2011-07-09
接口的详解,是你很容易学习接口
2011-03-08
企业电子商城系统(jsp+servlet +strut+sqlserver)
2011-07-09
权限管理系统
2013-03-23
物流信息网(jsp+sqlserver+servlet+strut)
2011-07-09
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人