- Spring Boot 项目中 Redis 常见问题及解决方案
格子先生Lab
springbootredis后端
目录缓存穿透缓存雪崩缓存击穿Redis连接池耗尽Redis序列化问题总结1.缓存穿透问题描述缓存穿透是指查询一个不存在的数据,由于缓存中没有该数据,请求会直接打到数据库上,导致数据库压力过大。解决方案缓存空值:即使查询的数据不存在,也将空值缓存起来,并设置一个较短的过期时间。布隆过滤器:在查询缓存之前,先通过布隆过滤器判断数据是否存在。示例代码@ServicepublicclassUserServ
- SpringBoot 自动配置原理详解
蒂法就是我
springbootjavamybatis
SpringBoot的自动配置是其核心特性之一,它允许开发者通过最小化配置来快速启动应用程序。自动配置基于“约定优于配置”的原则,使得javer可以更专注于业务逻辑,而不必关注繁琐的配置。自动配置的基本工作原理SpringFactoriesSpringBoot利用META-INF/spring.factories文件来加载自动配置类。在这个文件里,有一个关键的入口org.springframewo
- YashanDB更换服务器IP
数据库
本文内容来自YashanDB官网,原文内容请见https://doc.yashandb.com/yashandb/23.3/zh/%E5%AE%89%E8%A3%85%...本文主要介绍当一个单机部署的数据库集群中,一台或多台服务器的IP发生变更时,管理员如何通过yasbootipchange命令进行数据库层面的IP更换操作,最终使得数据库恢复可用。下述操作将以一主两备环境中的两台服务器IP发生变
- YashanDB滚动升级
数据库
本文内容来自YashanDB官网,原文内容请见https://doc.yashandb.com/yashandb/23.3/zh/%E5%AE%89%E8%A3%85%...YashanDB支持通过yasboot工具滚动升级已经部署的数据库,在数据库不停机的情况下,将数据库二进制文件升级到新版本。本文将以23.3.1.0版本升级到23.3.1.1版本为例介绍数据库的滚动升级方式。注意事项滚动升级适
- 对比 ThinkPHP 中间件 和 Java AOP
众乐乐_2008
php中间件java开发语言
是的,ThinkPHP的中间件(Middleware)类似于Java的AOP(Aspect-OrientedProgramming,面向切面编程),特别是SpringAOP中的拦截器(Interceptor)或过滤器(Filter)。两者都是在请求进入控制器之前、或者响应返回客户端之前,拦截并执行额外的逻辑,比如身份验证、日志记录、数据转换等。对比ThinkPHP中间件和JavaAOP特性Thin
- YashanDB更换服务器IP
数据库
本文内容来自YashanDB官网,原文内容请见https://doc.yashandb.com/yashandb/23.3/zh/%E5%AE%89%E8%A3%85%...本文主要介绍当一个单机部署的数据库集群中,一台或多台服务器的IP发生变更时,管理员如何通过yasbootipchange命令进行数据库层面的IP更换操作,最终使得数据库恢复可用。下述操作将以一主两备环境中的两台服务器IP发生变
- YashanDB离线升级
数据库
本文内容来自YashanDB官网,原文内容请见https://doc.yashandb.com/yashandb/23.3/zh/%E5%AE%89%E8%A3%85%...YashanDB支持通过yasboot工具离线升级已部署的数据库,将数据库二进制文件升级到新版本。Note:本文中所有路径、版本号、用户、密码与回显信息等仅为示例,请以实际为准。注意事项离线升级要求当前数据库无新业务数据产生,
- 【Spring Boot 接入 MongoDB】
龙少9543
后端springbootmongodb后端
【SpringBoot接入MongoDB】在SpringBoot项目中接入MongoDB是一个常见的需求,以下是详细的步骤和配置方法:1.添加依赖在pom.xml文件中添加SpringDataMongoDB的依赖。org.springframework.bootspring-boot-starter-data-mongodb如果你使用的是Gradle,可以添加以下内容:implementation
- Spring AI 实战:手把手教你打造一个智能客服机器人!
Leaton Lee
spring人工智能机器人
前言:为什么要做一个智能客服机器人?在当今数字化时代,智能客服机器人已经成为企业提升用户体验和服务效率的重要工具。无论是解答用户问题、处理订单咨询,还是提供技术支持,智能客服机器人都能够高效地完成任务。SpringAI框架为我们提供了一个强大的工具集,结合自然语言处理(NLP)技术,我们可以轻松地构建一个功能强大的智能客服机器人。本文将从零开始,一步步教你如何利用SpringAI和相关技术打造一个
- Spring事务失效场景与解析
zj6182007
java数据库开发语言
在使用Spring框架进行开发时,事务管理是确保数据一致性和完整性的关键机制。然而,在某些情况下,开发者可能会遇到事务失效的问题,导致预期的事务回滚或提交行为未能如期执行。本文将深入探讨Spring事务失效的常见场景,分析其背后的原理,并通过实战代码示例,帮助读者理解这些问题的成因及解决方案。1.自调用(Self-invocation)问题描述:Spring的声明式事务管理依赖于AOP(面向切面编
- Nacos 深度解析与实战指南:构建云原生微服务的核心枢纽
小小初霁
云原生微服务架构
1.Nacos简介Nacos(DynamicNamingandConfigurationService)是阿里巴巴开源的云原生平台核心组件,集服务发现、配置管理、动态DNS和服务元数据管理于一体,支持Kubernetes、SpringCloud、Dubbo等主流生态。其核心理念是帮助开发者快速构建弹性可扩展、高可用的微服务架构。核心优势:一站式解决方案:同时管理服务与配置,降低组件维护成本。多环境
- Mybatis xml 无法正常解析 Invalid bound statement
javaspringboot
问题背景使用插件mybatisX生成的mapper.xml没有办法被正常解析,项目使用的是nacos作为配置中心;问题定位首先看了一下网上说的常见几种问题,比如id不匹配,或者说pom里缺少resource配置导致target里没有xml;这些都没有出现;那接下来就只能从源码出发解决问题;通过报错的堆栈信息我发现问题的出发点是在这里publicSqlCommand(Configurationcon
- Spring Boot 切面执行优先级配置指南
蓝田~
springboot后端java
引言在SpringBoot应用开发中,切面编程(AOP)是一项强大的功能,它允许我们将横切关注点(如日志记录、事务管理、权限控制等)从业务逻辑中分离出来,以提高代码的可维护性和可扩展性。当存在多个切面时,了解和控制切面的执行优先级顺序就显得尤为重要。本文将深入介绍SpringBoot框架中切面执行优先级顺序的使用方式。切面优先级的概念在SpringAOP中,切面的优先级决定了多个切面在目标方法执行
- 策略模式处理
茶本无香
策略模式
首先,定义接口或抽象父类。例如,定义一个Strategy接口,里面有execute方法。然后不同的策略类实现这个接口,比如ConcreteStrategyA、ConcreteStrategyB等,每个类用@Component注解,可能指定Bean的名字,或者用默认的类名首字母小写作为Bean名称。然后,需要将这些Bean自动注入到一个Map中。Spring支持将同一类型的Bean注入到Map中,其
- (一)spring 的依赖注入,您了解多少?
chuhx
学习javaIOCspringjava后端
之前整理过一篇文章:依赖查找和依赖注入的区别,这篇文章讲到依赖查找和依赖注入是IOC的实现手段。我们实际工作中用到比较多的是依赖注入,具体依赖注入的模式和类型你有了解多少?网上基本说有三种方式:构造器注入、setter注入、接口注入,或者再加上一种注解注入。本文详细介绍下注入的模式和类型。依赖注入的模式,依赖注入模式一般分为两类:手动注入和自动注入。手动模式即配置或者编程的方式,提前安排注入规则,
- SpringBoot对接外部API三大绝技:RestTemplate vs WebClient vs Feign,你Pick哪个?
墨瑾轩
一起学学Java【一】java
在SpringBoot应用中调用外部接口是常见的需求,通常用于集成第三方服务、微服务间通信等场景。以下是三种常用的调用外部接口的方式,包括代码示例和详细注释:1.使用RestTemplateRestTemplate是Spring提供的一个用于访问REST服务的客户端模板类,它简化了HTTP请求的处理过程。 Javaimportorg.springframework.beans.factory.an
- PXE批量安装服务器
helpme流水
服务器运维
KickStart自动化安装部署PXE原理PXE(prebootexecuteenvironment,预启动执行环境)是由Intel公司开发的最新技术,工作于Client/Server的网络模式,支持工作站通过网络从远端服务器下载映像,并由此支持通过网络启动操作系统,在启动过程中,终端要求服务器分配IP地址,再用TFTP(trivialfiletransferprotocol)或MTFTP(mul
- 查看归档日志及rman备份文件
大叶梧桐
LINUX归档日志man备份
[root@his1/]#ls----查看**/**根目录下的文件archivebootdevhomelib64mediamntoptrmansbinsrvtmpusrbincgroupetcliblost+foundmiscnetprocrootselinuxsysu01var[root@his1/]#cdarchive/------进入archive/[root@his1archive]#ls
- springboot webflux webclient 使用示例
o_瓜田李下_o
webflux
springbootwebfluxwebclient使用示例************************示例HelloController@RestControllerpublicclassHelloController{@RequestMapping("/hello")publicMaphello(ServerWebExchangeexchange){exchange.getRequest(
- 调用链追踪(Trace ID)
18你磊哥
java
前言:在Java中实现调用链追踪(TraceID)通常用于分布式系统中跟踪请求的完整链路,常见的实现方式包括手动编码或使用开源框架(如SkyWalking、Zipkin、SpringCloudSleuth等)。以下是具体实现方法及示例:1.手动实现TraceID通过ThreadLocal或MDC(MappedDiagnosticContext)存储TraceID,并在请求链路中传递。步骤1:定义T
- 【Spring】WebClient之请求头设置、超时设置
九师兄
bootspringjavaspringboot
1.概述I.项目环境本项目借助SpringBoot2.2.1.RELEASE+maven3.5.3+IDEA进行开发1.依赖使用WebClient,最主要的引入依赖如下(省略掉了SpringBoot的相关依赖,如对于如何创建SpringBoot项目不太清楚的小伙伴,可以关注一下我之前的博文)org.springframework
- springboot中Webclient对象怎么禁止缓存、保证每次数据都属来源后端
阿里嘎多学长
springboot缓存数据库
在SpringBoot中,使用WebClient对象进行HTTP请求时,可以通过配置请求头来禁止缓存,确保每次请求都能从后端获取最新的数据。以下是一些常用的方法来实现这一目的:设置Cache-Control请求头:在发起请求时,可以设置Cache-Control请求头为no-cache,这会告诉服务器和任何中间缓存,不应使用缓存的响应来满足请求。WebClientwebClient=WebClie
- SpringBoot集成Sentry日志收集-2 (Sentry修改语言为中文)
欢乐少年1904
springbootsentry后端
Sentry修改成中文英文状态是不太友好,对于我这个英文不好的人来说,我用的一切开发软件,全是中文
- 基于springboot+ollama实现大模型接入项目的小白笔记
河禾合和
springboot笔记后端llama
org.springframework.ai无法被maven加载的问题问题原因:阿里镜像没有这个库共用库中只保存了0.8.1的测试版本解决方法:参考了这个视频https://www.youtube.com/watch?v=dffEF9ORVUg学习视频中方法使用springinitializr这个工具进行项目的生成具体参数如下图在右边依赖中搜索ollama加载ai依赖,以及springweb依赖,
- Spring Boot 缓存最佳实践:从基础到生产的完整指南
天才选手Yoke
javaspringbootspringboot缓存后端redis
SpringBoot缓存最佳实践:从基础到生产的完整指南引言在现代分布式系统中,缓存是提升系统性能的银弹。SpringBoot通过spring-boot-starter-cache模块提供了开箱即用的缓存抽象,但如何根据业务需求实现灵活、可靠的缓存方案?本文将带您从零开始,逐步构建符合生产要求的缓存系统。一、基础篇:5分钟快速接入1.1最小化配置pom.xml依赖org.springframewo
- Spring Boot 3.0深度实战:从核心特性到生产级调优
Code_Cracke
Javaspringboot后端java
一、SpringBoot3.0核心特性解读1.1JDK17LTS支持(实测性能提升)记录类(Record)与SpringDataJPA完美适配模式匹配简化类型判断密封类(SealedClass)增强DTO安全性//使用Record优化DTOpublicrecordUserDTO(@NotBlankStringusername,@EmailStringemail){}//密封接口定义响应类型publ
- MyBatis-Plus开发流程:Spring Boot + MyBatis-Plus 实现对 book_tab 表的增删改查及Redis缓存
Darling &you&
mybatis缓存springboot
前言MyBatis-Plus是一个MyBatis的增强工具,旨在简化开发、减少工作量。本文将介绍如何使用SpringBoot集成MyBatis-Plus来操作数据库,并结合Redis实现数据的缓存功能。1项目搭建1.1创建SpringBoot项目可以通过SpringInitializr快速创建一个新的SpringBoot项目,选择必要的依赖如SpringWeb,MyBatisPlus,MySQLD
- Docker 安装报【未打开 com.docker.vmnetd 因其包含恶意软件此操作未对 mac 造成危害】
Docker的Bug原本以为是电脑中病毒了呢!解决方案:执行如下脚本即可#!/bin/bash#Stopthedockerservicesecho"StoppingDocker..."sudopkill'[dD]ocker'#Stopthevmnetdserviceecho"Stoppingcom.docker.vmnetdservice..."sudolaunchctlbootoutsystem
- imx6ull,从uboot到linux启动
只慢半拍
linuxubuntu运维
很久没搞嵌入式了,为了学习,买了正点的arm板子,芯片是Freescale的imx6ull。为了更好的学习,决定放弃正点官网的资料,一切都从原网下载。原料准备imx6ull手册官网下载正点imx6ull的板子TB买的一张小SD卡JD买的交叉编译工具https://releases.linaro.org/components/toolchain/binaries/latest-7/arm-linux
- Linux内核笔记(驱动篇)之 【u-boot移植--基于正点原子iMX6ull开发板】
哆哆jarvis
Linux内核与驱动进阶之路嵌入式
博主珍藏笔记干货在这里!Linux内核笔记汇总【持续更新】更好的阅读体验请见:u-boot移植–基于正点原子iMX6ull开发板文章目录添加自己的开发板添加开发板对应的头文件添加开发板对应的板级文件夹编译测试烧写屏幕&网络驱动移植软件层面的修改修改*`include/configs/mx6ull_jarvis_emmc.h`*修改*`board/freescale/mx6ull_jarvis_em
- ASM系列四 利用Method 组件动态注入方法逻辑
lijingyao8206
字节码技术jvmAOP动态代理ASM
这篇继续结合例子来深入了解下Method组件动态变更方法字节码的实现。通过前面一篇,知道ClassVisitor 的visitMethod()方法可以返回一个MethodVisitor的实例。那么我们也基本可以知道,同ClassVisitor改变类成员一样,MethodVIsistor如果需要改变方法成员,注入逻辑,也可以
- java编程思想 --内部类
百合不是茶
java内部类匿名内部类
内部类;了解外部类 并能与之通信 内部类写出来的代码更加整洁与优雅
1,内部类的创建 内部类是创建在类中的
package com.wj.InsideClass;
/*
* 内部类的创建
*/
public class CreateInsideClass {
public CreateInsideClass(
- web.xml报错
crabdave
web.xml
web.xml报错
The content of element type "web-app" must match "(icon?,display-
name?,description?,distributable?,context-param*,filter*,filter-mapping*,listener*,servlet*,s
- 泛型类的自定义
麦田的设计者
javaandroid泛型
为什么要定义泛型类,当类中要操作的引用数据类型不确定的时候。
采用泛型类,完成扩展。
例如有一个学生类
Student{
Student(){
System.out.println("I'm a student.....");
}
}
有一个老师类
- CSS清除浮动的4中方法
IT独行者
JavaScriptUIcss
清除浮动这个问题,做前端的应该再熟悉不过了,咱是个新人,所以还是记个笔记,做个积累,努力学习向大神靠近。CSS清除浮动的方法网上一搜,大概有N多种,用过几种,说下个人感受。
1、结尾处加空div标签 clear:both 1 2 3 4
.div
1
{
background
:
#000080
;
border
:
1px
s
- Cygwin使用windows的jdk 配置方法
_wy_
jdkwindowscygwin
1.[vim /etc/profile]
JAVA_HOME="/cgydrive/d/Java/jdk1.6.0_43" (windows下jdk路径为D:\Java\jdk1.6.0_43)
PATH="$JAVA_HOME/bin:${PATH}"
CLAS
- linux下安装maven
无量
mavenlinux安装
Linux下安装maven(转) 1.首先到Maven官网
下载安装文件,目前最新版本为3.0.3,下载文件为
apache-maven-3.0.3-bin.tar.gz,下载可以使用wget命令;
2.进入下载文件夹,找到下载的文件,运行如下命令解压
tar -xvf apache-maven-2.2.1-bin.tar.gz
解压后的文件夹
- tomcat的https 配置,syslog-ng配置
aichenglong
tomcathttp跳转到httpssyslong-ng配置syslog配置
1) tomcat配置https,以及http自动跳转到https的配置
1)TOMCAT_HOME目录下生成密钥(keytool是jdk中的命令)
keytool -genkey -alias tomcat -keyalg RSA -keypass changeit -storepass changeit
- 关于领号活动总结
alafqq
活动
关于某彩票活动的总结
具体需求,每个用户进活动页面,领取一个号码,1000中的一个;
活动要求
1,随机性,一定要有随机性;
2,最少中奖概率,如果注数为3200注,则最多中4注
3,效率问题,(不能每个人来都产生一个随机数,这样效率不高);
4,支持断电(仍然从下一个开始),重启服务;(存数据库有点大材小用,因此不能存放在数据库)
解决方案
1,事先产生随机数1000个,并打
- java数据结构 冒泡排序的遍历与排序
百合不是茶
java
java的冒泡排序是一种简单的排序规则
冒泡排序的原理:
比较两个相邻的数,首先将最大的排在第一个,第二次比较第二个 ,此后一样;
针对所有的元素重复以上的步骤,除了最后一个
例题;将int array[]
- JS检查输入框输入的是否是数字的一种校验方法
bijian1013
js
如下是JS检查输入框输入的是否是数字的一种校验方法:
<form method=post target="_blank">
数字:<input type="text" name=num onkeypress="checkNum(this.form)"><br>
</form>
- Test注解的两个属性:expected和timeout
bijian1013
javaJUnitexpectedtimeout
JUnit4:Test文档中的解释:
The Test annotation supports two optional parameters.
The first, expected, declares that a test method should throw an exception.
If it doesn't throw an exception or if it
- [Gson二]继承关系的POJO的反序列化
bit1129
POJO
父类
package inheritance.test2;
import java.util.Map;
public class Model {
private String field1;
private String field2;
private Map<String, String> infoMap
- 【Spark八十四】Spark零碎知识点记录
bit1129
spark
1. ShuffleMapTask的shuffle数据在什么地方记录到MapOutputTracker中的
ShuffleMapTask的runTask方法负责写数据到shuffle map文件中。当任务执行完成成功,DAGScheduler会收到通知,在DAGScheduler的handleTaskCompletion方法中完成记录到MapOutputTracker中
- WAS各种脚本作用大全
ronin47
WAS 脚本
http://www.ibm.com/developerworks/cn/websphere/library/samples/SampleScripts.html
无意中,在WAS官网上发现的各种脚本作用,感觉很有作用,先与各位分享一下
获取下载
这些示例 jacl 和 Jython 脚本可用于在 WebSphere Application Server 的不同版本中自
- java-12.求 1+2+3+..n不能使用乘除法、 for 、 while 、 if 、 else 、 switch 、 case 等关键字以及条件判断语句
bylijinnan
switch
借鉴网上的思路,用java实现:
public class NoIfWhile {
/**
* @param args
*
* find x=1+2+3+....n
*/
public static void main(String[] args) {
int n=10;
int re=find(n);
System.o
- Netty源码学习-ObjectEncoder和ObjectDecoder
bylijinnan
javanetty
Netty中传递对象的思路很直观:
Netty中数据的传递是基于ChannelBuffer(也就是byte[]);
那把对象序列化为字节流,就可以在Netty中传递对象了
相应的从ChannelBuffer恢复对象,就是反序列化的过程
Netty已经封装好ObjectEncoder和ObjectDecoder
先看ObjectEncoder
ObjectEncoder是往外发送
- spring 定时任务中cronExpression表达式含义
chicony
cronExpression
一个cron表达式有6个必选的元素和一个可选的元素,各个元素之间是以空格分隔的,从左至右,这些元素的含义如下表所示:
代表含义 是否必须 允许的取值范围 &nb
- Nutz配置Jndi
ctrain
JNDI
1、使用JNDI获取指定资源:
var ioc = {
dao : {
type :"org.nutz.dao.impl.NutDao",
args : [ {jndi :"jdbc/dataSource"} ]
}
}
以上方法,仅需要在容器中配置好数据源,注入到NutDao即可.
- 解决 /bin/sh^M: bad interpreter: No such file or directory
daizj
shell
在Linux中执行.sh脚本,异常/bin/sh^M: bad interpreter: No such file or directory。
分析:这是不同系统编码格式引起的:在windows系统中编辑的.sh文件可能有不可见字符,所以在Linux系统下执行会报以上异常信息。
解决:
1)在windows下转换:
利用一些编辑器如UltraEdit或EditPlus等工具
- [转]for 循环为何可恨?
dcj3sjt126com
程序员读书
Java的闭包(Closure)特征最近成为了一个热门话题。 一些精英正在起草一份议案,要在Java将来的版本中加入闭包特征。 然而,提议中的闭包语法以及语言上的这种扩充受到了众多Java程序员的猛烈抨击。
不久前,出版过数十本编程书籍的大作家Elliotte Rusty Harold发表了对Java中闭包的价值的质疑。 尤其是他问道“for 循环为何可恨?”[http://ju
- Android实用小技巧
dcj3sjt126com
android
1、去掉所有Activity界面的标题栏
修改AndroidManifest.xml 在application 标签中添加android:theme="@android:style/Theme.NoTitleBar"
2、去掉所有Activity界面的TitleBar 和StatusBar
修改AndroidManifes
- Oracle 复习笔记之序列
eksliang
Oracle 序列sequenceOracle sequence
转载请出自出处:http://eksliang.iteye.com/blog/2098859
1.序列的作用
序列是用于生成唯一、连续序号的对象
一般用序列来充当数据库表的主键值
2.创建序列语法如下:
create sequence s_emp
start with 1 --开始值
increment by 1 --増长值
maxval
- 有“品”的程序员
gongmeitao
工作
完美程序员的10种品质
完美程序员的每种品质都有一个范围,这个范围取决于具体的问题和背景。没有能解决所有问题的
完美程序员(至少在我们这个星球上),并且对于特定问题,完美程序员应该具有以下品质:
1. 才智非凡- 能够理解问题、能够用清晰可读的代码翻译并表达想法、善于分析并且逻辑思维能力强
(范围:用简单方式解决复杂问题)
- 使用KeleyiSQLHelper类进行分页查询
hvt
sql.netC#asp.nethovertree
本文适用于sql server单主键表或者视图进行分页查询,支持多字段排序。KeleyiSQLHelper类的最新代码请到http://hovertree.codeplex.com/SourceControl/latest下载整个解决方案源代码查看。或者直接在线查看类的代码:http://hovertree.codeplex.com/SourceControl/latest#HoverTree.D
- SVG 教程 (三)圆形,椭圆,直线
天梯梦
svg
SVG <circle> SVG 圆形 - <circle>
<circle> 标签可用来创建一个圆:
下面是SVG代码:
<svg xmlns="http://www.w3.org/2000/svg" version="1.1">
<circle cx="100" c
- 链表栈
luyulong
java数据结构
public class Node {
private Object object;
private Node next;
public Node() {
this.next = null;
this.object = null;
}
public Object getObject() {
return object;
}
public
- 基础数据结构和算法十:2-3 search tree
sunwinner
Algorithm2-3 search tree
Binary search tree works well for a wide variety of applications, but they have poor worst-case performance. Now we introduce a type of binary search tree where costs are guaranteed to be loga
- spring配置定时任务
stunizhengjia
springtimer
最近因工作的需要,用到了spring的定时任务的功能,觉得spring还是很智能化的,只需要配置一下配置文件就可以了,在此记录一下,以便以后用到:
//------------------------定时任务调用的方法------------------------------
/**
* 存储过程定时器
*/
publi
- ITeye 8月技术图书有奖试读获奖名单公布
ITeye管理员
活动
ITeye携手博文视点举办的8月技术图书有奖试读活动已圆满结束,非常感谢广大用户对本次活动的关注与参与。
8月试读活动回顾:
http://webmaster.iteye.com/blog/2102830
本次技术图书试读活动的优秀奖获奖名单及相应作品如下(优秀文章有很多,但名额有限,没获奖并不代表不优秀):
《跨终端Web》
gleams:http