备案 控制台
开发者社区 芋道源码 文章 正文

这五款牛逼的 IDEA 插件,堪称代码质量检查利器!

简介: 这五款牛逼的 IDEA 插件,堪称代码质量检查利器!


  • 原创 | Java 2021 超神之路,很肝~
  • 中文详细注释的开源项目
  • RPC 框架 Dubbo 源码解析
  • 网络应用框架 Netty 源码解析
  • 消息中间件 RocketMQ 源码解析
  • 数据库中间件 Sharding-JDBC 和 MyCAT 源码解析
  • 作业调度中间件 Elastic-Job 源码解析
  • 分布式事务中间件 TCC-Transaction 源码解析
  • Eureka 和 Hystrix 源码解析
  • Java 并发源码

来源:blog.csdn.net/ a745233700?type=blog

  • 一、Alibaba Java Coding Guidelines
  • 二、CheckStyle:
  • 三、PMD
  • 四、FindBugs:
  • 五、SonarLint:
  • 总结


随着业务的发展,系统会越来越庞大,原本简单稳定的功能,可能在不断迭代后复杂度上升,潜在的风险也随之暴露,导致最终服务不稳定,造成业务价值的损失。而为了减少这种情况,其中一种比较好的方式就是提高代码质量,比如通过代码审查,从而降低错误风险,但是,代码审查难度大,代码缺陷、漏洞不易发现,且审查工作随着代码量增加而增加,审查效率低。

工欲善其事,必先利其器,因此,这篇文章给大家介绍几种检查代码质量的利器,Alibaba Java Coding Guidelines、CheckStyle、PMD、FindBugs、SonarLint,让你在关注代码质量的同时,减少 code review 的工作量,提高 code review 的效率,并通过代码质量分析去反向提升我们的代码编写能力

一、Alibaba Java Coding Guidelines

1、整体介绍:

Alibaba Java Coding Guidelines 专注于Java代码规范,目的是让开发者更加方便、快速规范代码格式。该插件在扫描代码后,将不符合规约的代码按 Blocker、Critical、Major 三个等级显示出来,并且大部分可以自动修复,它还基于 Inspection 机制提供了实时检测功能,编写代码的同时也能快速发现问题所在。

阿里巴巴规约扫描包括:

  • OOP规约
  • 并发处理
  • 控制语句
  • 命名规约
  • 常量定义
  • 注释规范

2、安装步骤:

File > Settings > Plugins > Marketplace 搜索 “Alibaba Java Coding Guidelines”,按照提示进行安装,然后重启即可。

3、使用说明:

3.1、运行方式:

(1)可以Tools > 阿里编码规约 > 编码规约扫描

(2)在编辑界面或者项目区域点击右键,在右键菜单中选择“编码规约扫描”即可:

3.2、菜单功能:

  • 编码规约扫描 :开始扫描代码
  • 打开/关闭实时检测功能 :实时检测代码,一般机器性能比较好的话可以开启这项功能
  • 切换语言至英文 :中英文切换

3.3、运行结果:

扫描完成后显示结果如下,我们可以看到扫描结果主要分为 Blocker(阻挡者)、Critical(严重问题)、Major(主要的)三个大类,它们表示的是问题的严重程度,严重程度由高到低为:Blocker > Critical > Major,至于每一类中都会包含什么样的问题,图中的内容已经说明了一切。

选中其中的一个问题项目,会出现如下内容(如果当前鼠标点击的是最终项,右边区域显示的是其它的内容,后面会再讲到):

(1)指定区域搜索同一类问题:

当点击③处的按钮时,会弹出如下按钮:

这里选择扫描区域,来扫描鼠标选中的同类问题。如果按照默认选择,那么运行后的结果就如下图所示:

这里我们可以看到,显示了整个Project中的所有该类的问题。

(2)预览具体的不规范代码:

如果点击的是最终的问题点或者问题所在的类文件,那显示的就是如下界面,预览该处不规范的代码。

3.4、工具栏功能介绍:

  • Rerun Inspection:重新运行一次扫描
  • Close:关闭真个AJCG面板
  • Expand All:展开结果的树状结构,整个结果是树状结构的。
  • Collapse All:收起结果的树状结构
  • Go Pre Problem:选择上一个问题
  • Go Next Problem:选择下一个问题
  • Help:帮助
  • Group by Serverity:(不知道如何描述)
  • Group by derectory:按目录分组/按类名分组间切换
  • Filter resoled items:过滤掉已经解决的项
  • Autoscroll to Source:自动滚动到源码
  • Export:导出,可以导出为XML和HTML两种格式
  • Edit Settings:编辑设置

基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址: https://gitee.com/zhijiantianya/ruoyi-vue-pro
  • 视频教程: https://doc.iocoder.cn/video/

二、CheckStyle:

1、整体介绍:

CheckStyle 侧重检查编码格式和代码风格规范,如命名规范、Javadoc注释规范、空格规范、size度量(如过长的方法)、重复代码、多余Imports等,从而有效约束开发人员更好地遵循代码编写规范。Checkstyle主要是文法层面的代码编写规范的分析,对bug几乎没什么发现能力。

Checkstyle插件中默认内置有2个执行代码检查的配置文件(Sun Checks 和 Sun Checks),但是这两个文件检查的非常详细严格,即使优秀的开源项目也会检查出来有非常多的错误告信息,所以需要导入我们自定义的配置文件。

2、安装步骤:

通过 File > Settings > Plugins > Marketplace 搜索 “CheckStyle”,按照提示进行安装,然后重启即可。

3、使用说明:

可以看到基本都是一些缩进啥的编码规范,可以不用太关注

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址: https://gitee.com/zhijiantianya/yudao-cloud
  • 视频教程: https://doc.iocoder.cn/video/

三、PMD

1、整体介绍:

PMD侧重面向安全编码规则,且具备一定的数据流分析和路径分析能力,能力比CheckStyle稍微强点,并且 PMD 支持自定义规则,PMD可以直接使用的规则包括以下内容:

  • 潜在的bug :空的try/catch/finally/switch语句
  • 未使用的代码(Dead code) :未使用的变量、参数、私有方法等
  • 可选的代码String/StringBuffer的滥用
  • 复杂的表达式 :不必须的if语句、可被while替代的for循环
  • 重复的代码 :拷贝/粘贴代码意味着拷贝/粘贴bugs
  • 循环体创建新对象 :尽量不要在循环体内实例化新对象
  • 资源关闭 :Connect,Result,Statement等使用之后确保关闭掉

2、安装步骤:

通过 File > Settings > Plugins > Marketplace 搜索 “PMDPlugin”,按照提示进行安装,然后重启即可

3、使用说明:

  • 参考文章: http://wjhsh.net/andy-songwei-p-11830812.html

3.1、运行方式:

(1)从Tools菜单中启动:

通过 Tools > Run PMD 可以看到如下的界面,如果通过该方式启动,扫描的范围就是整个项目中的文件了。

  • Pre Defined :预定义的规则,也就是插件自带的检测规则。后面展开的列表中列出了所有的规则列表,想扫描哪一种类型的问题,点击即可。其中“All”表示使用所有的规则。
  • Custom Rules :自定义的检测规则,PMD允许用户根据需要自定义检查规则,默认这里是不可点击的,需要在设置中导入自定义规则文件后方可选择。

(2)从右键菜单中启动:

在文件或者编辑器中点击右键,也可以看到“Run PMD”选项,如果通过该方式启动, 检测范围取决于鼠标或光标当前所选中的区域。

3.2、运行结果:

运行后会出现如上所示的面板,左边工具栏,鼠标停留在上面会提示其功能;右边显示了检测结果,当点击具体某一问题项时,会跳转到对应的源码中。

3.3、配置检测规则:

通过 File > Settings > Other Settings > PMD 可以打开检测规则的设置界面:

在 “RuleSets(规则设置)” 界面可以管理自定义的检测规则。因为在实际工作中,可能需要根据实际情况自定义检测规则,就可以通过这里导入,如果要使用它,需要在启动PMD进行检测时选择该自定义规则。

点击“Options”选项卡,在其中可以配置一些检测规则选项:

其中重点需要留意的是“Skip TestSource”这一项,因为在项目中有不少Android Studio自动生成的测试代码,如下所示,选择上述选项后可以将其过滤掉。

四、FindBugs:

1、整体介绍:

FindBugs 侧重于发现代码中存在的bug,如运行时错误检测(空指针检查、未合理关闭资源、字符串相同判断错(==,而不是equals)等),它可以简单高效全面地帮助我们发现程序代码中存在的bug以及潜在隐患,针对各种问题,它提供了简单的修改意见供我们参考

2、安装步骤:

通过 File > Settings > Plugins > Marketplace 搜索 “FindBugs”,按照提示进行安装,然后重启即可

3、使用说明:

FindBugs 可以分析单个文件、包下面的所有文件、整个module下的文件、整个project下的文件,右键想要分析的文件名/包名/module/project

分析完之后就会出现结果面板

点击对应的item在右边会定位到具体的代码,这是根据提示进行处理修改就行

4、附:常见的错误信息

4.1、Bad practice 代码坏习惯:

错误信息 说明
Class names should start with an upper case letter 主要包括类名的命名,以大写字母开头
Method names should start with a lower case letter 方法名以小写字母开头
Field names should start with a lower case letter 字段名以小写字母开头
equals()method does not check for null argument equals()方法应该检查非空
Class defines equals() and uses Object.hashCode() 一个类重写了equals方法,但没有重写hashCode方法,使用了Object对象的hashCode方法
Method ignores exceptional return value 方法忽略返回值的异常信息
Equals method should not assume anything about the type of its argument equals(Object o)方法不能对参数o的类型做任何的假设。比较此对象与指定的对象,当且仅当该参数不为 null,并且是表示与此对象相同的类型的对象时,结果才为 true。
Comparison of String objects using == or != 用==或者!=去比较String类型的对象
Method might ignore exception 方法可能忽略异常
Method invokes System.exit() 在方法中调用System.exit(…)语句,考虑用RuntimeException来代替
Method ignores result of InputStream.read() InputStream.read 方法忽略返回的多个字符,如果对结果没有检查就没法正确处理用户读取少量字符请求的情况

4.2、Dodgy code 糟糕的代码:

错误信息 说明
Switch statement found where default case is missing Switch没有默认情况下执行的case语句
Switch statement found where one case falls through to the next case Switch语句中一个分支执行后又执行了下一个分支。通常case后面要跟break 或者return语句来跳出
Dead store to local variable 该指令为局部变量赋值,但在其后的没有对它做任何使用。
Write to static field from instance method 在实例方法写入静态字段
Redundant nullcheck of value known to be non-null 方法中对不为空的值进行为空的判断
Method uses the same code for two branches 此方法使用相同的代码,以实现两个有条件的分支。检查以确保这是不是一个编码错误
Exception is caught when Exception is not thrown 在try/catch块中捕获异常,但是异常没有在try语句中抛出而RuntimeException又没有明确的被捕获
Integral division result cast to double or float 整形数除法强制转换为double或者float类型
Possible null pointer dereference due to return value of called method 方法的返回值没有进行是否为空的检查就重新赋值,这样可能会出现空指针异常
Useless object created 对象创建了,但并没有使用
Unread public/protected field 没有用到的字段

4.3、Internationalization 代码国际化相关:

错误信息 说明
Consider using Locale parameterized version of invoked method 使用平台默认的编码格式对字符串进行大小写转换,这可能导致国际字符的转换不当。使用以下方式对字符进行转换

4.4、Performance 代码性能相关:

错误信息 说明
Boxing/unboxing to parse a primitive 类型转换,比如字符串转换成int,应该使用 Integer.parseInt(“”) 代替 Integer.valueOf(“”)
Method concatenates string using + in aloop 每次循环里的字符串+连接,都会新产生一个string对象,在java中,新建一个对象的代价是很昂贵的,特别是在循环语句中,效率较低。解决办法:使用StringBuffer或者StringBuilder重用对象
Private method is never called 私有方法没有被调用
Explicit garbage collection;extremely dubious except in benchmarking code 在代码中显式的调用垃圾回收方法,这样做并不能起作用。关闭操作或者finalize方法中调用垃圾回收方法会导致很多的性能浪费,这样大规模回收对象时会造成处理器运行缓慢。
Unread field:should this field be static? 没有用到的static 字段
should be a static inner class 此内部类应该使用static修饰

4.5、Experimental

错误信息 说明
Method may fail to clean up stream or resource on checked exception 这种方法可能无法清除(关闭,处置)一个流,数据库对象,或其他资源需要一个明确的清理行动,解决方法:流的关闭都写在finally里面

4.6、Malicious code vulnerability 恶意破坏代码相关:

错误信息 说明
May expose internal representation by incorporating reference to mutable object 此代码把外部可变对象引用存储到对象的内部表示。如果实例受到不信任的代码的访问和没有检查变化,将危及对象和重要属性的安全。解决方式:存储一个对象的副本,在很多情况下是更好的办法。
Field isn’t final but should be 此字段前应该加final
Field isn’t final and can’t be protected from malicious code 一个静态字段是可以被恶意代码或其他的包访问修改。可以把这种类型的字段声明为final类型的以防止这种错误
Field should be package protected 此字段前应该加protected

4.7、Multithreaded correctness 多线程代码正确性相关:

错误信息 说明
Static DateFormat DateFormat 在多线程中本身就是不安全的,如果在线程范围中共享一个DateFormat的实例,而不使用一个同步的方法在应用中就会出现一些奇怪的行为
Call to static DateFormat DateFormats 多线程使用本就是不安全的,改进方法:需要创建多实例或线程同步

4.8、Correctness 代码正确性相关:

错误信息 说明
Nullcheck of value previously dereferenced 此代码之前没有进行null值检查,解决办法:进行null检查
Possible null pointer dereference 可能为null
Null pointer dereference 对象赋为null值后,没有被重新赋值
Possible null pointer dereference in method on exception path 在异常null值处理分支调用的方法上,可能存在对象去除引用操作
value is null and guaranteed to be dereferenced on exception path exception 分支上,存在引用一个null对象的方法,引发空指针异常
Self comparison of value with itself 方法中对一个局部变量自身进行比较运算,并可说明错误或逻辑错误。请确保您是比较正确的事情
An apparent infinite recursive loop 明显的无限迭代循环,将导致堆栈溢出

五、SonarLint:

1、整体介绍:

sonar 比 Findbugs 高了一个层级,它不仅关注常规静态BUG,还关注到了如代码质量、包与包、类与类之间的依赖情况,代码耦合情况,类、方法、文件的复杂度,代码中是否包含大量复制粘贴的代码,关注的是项目代码整体的健康情况。sonar 有两种使用方式:插件和客户端,sonar 的插件名称为 sonarLint

2、安装步骤:

通过 File > Settings > Plugins > Marketplace 搜索 “SonarLint”,按照提示进行安装,然后重启即可

3、使用说明:

右键项目或者文件进行如上图所示操作,执行之后可以看到如下信息,如果代码中有不合理的地方会在report中显示,同时点击错误的地方在右边会给出建议的修改供参考。

4、配置 SonarLint 服务端:

4.1、配置 Sonar 服务器:

sonarLint 插件的使用场景是自用自审,但 sonar 也提供了平台版本,使用场景则是他审,sonar 平台的搭建就不在这篇文章介绍了,感兴趣的读者可以自己上网查看,我们这里主要介绍如何在 sonarLint 插件中配置关联 sonar 平台服务器的工程,进行本地检查:

点击新增按钮,输入Configuration Name,配置sonarlint 服务器的地址,然后下拉框选择 Login/Password,输入 sonarlint服务器的账号密码

4.2、具体 Sonar工程配置:

配置完服务器之后,需要针对具体工程进行配置,点击 connection下拉框,选择上面配置好的服务器连接,然后点击 Search in list,找到对应的工程:

4.3、使用 SonarLint 检查:

配置完上面两步之后,接下来就可以选择要进行检查的类或者目录进行 sonarlint 检查了(跟第3点的使用方式一致),同时,在 commit 代码的时候,勾选 “Perform Sonarlint analysis”,会针对你要提交的代码进行sonarlint检查

总结

  • 检查代码规范的话,直接使用 Alibaba Java Coding Guidelines 就可以了
  • 找 BUG 的话,使用 PMD、Findbugs、SonarLint 相互补充:
  • PMD 自定义能力强,用来自定义项目BUG规则非常好用
  • Findbugs 找 BUG 能力很强,我们拿找到的BUG给新员工培训也很好。
  • SonarLint 规则丰富,比 Findbugs 能覆盖到更全的场景


-编程工程师-
目录
相关文章
真的很搞笑
|
14天前
|
SQL 关系型数据库 MySQL
实时计算 Flink版产品使用合集之idea本地测试代码,要增大 Flink CDC 在本地 IDEA 测试环境中的内存大小如何解决
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
真的很搞笑
39 1
月亮给我抄代码
|
5天前
|
网络安全
IDEA 提交代码到 GitHub 时发生错误
摘要: 在遇到访问 GitHub 时的错误,这两个命令分别用于处理 SSL 连接问题和连接超时问题。
月亮给我抄代码
14 3
互联网课堂
|
10天前
|
SQL Java 数据库连接
IDEA开发插件有哪些值得推荐?
这篇文章介绍了IntelliJ IDEA中的一些高效插件,包括RestfulTool(用于快速定位API)、Translation(便捷的代码翻译工具)、Alibaba Java Coding Guidelines(代码规范检查)、Free MyBatis Tool(增强MyBatis开发体验)和Mybatis Log(SQL日志查看)。此外,还提到了Vue.js插件以及可选装的Grep Console(控制台日志分析)、Maven Helper(解决Maven依赖冲突)和Private Notes(源码注释管理)。作者提醒,虽然插件有用,但过多会影响IDE性能,应注重质量而非数量。
互联网课堂
65 1
互联网课堂
|
10天前
|
SQL Java 数据库连接
IDEA开发插件有哪些值得推荐?
这篇文章介绍了IntelliJ IDEA中一些实用的神仙插件,包括RestfulTool(用于快速定位请求处理代码)、Translation(方便代码中的英文翻译)、Alibaba Java Coding Guidelines(遵循阿里巴巴编码规范)、Free MyBatis Tool(增强MyBatis支持)和Mybatis Log(整理SQL日志)。此外,还提到了Vue.js插件和可选装的Grep Console(日志高亮)、Maven Helper(解决Maven依赖冲突)以及Private Notes和Rainbow Brackets(代码注释和括号颜色标记)。
互联网课堂
50 2
渐暖
|
16天前
idea的yapi插件使用详解
idea的yapi插件使用详解
渐暖
18 0
Byyyi
|
16天前
|
uml
【经验分享】如何在IDEA中快速学习|审查|复习代码工程?
在IDEA中加速工程学习与审查,提升代码质量和维护性,关键操作包括:使用"Structure"浏览工程结构,通过"Find Usages"查找类、方法或变量引用,借助"Show Local Changes As UML"展示UML图。遵循从整体到局部的UML图学习,再到具体代码的详细探索,可系统理解设计理念。详情参考[IDEA UML教程](https://blog.csdn.net/weixin_44701426/article/details/124598053)。
Byyyi
21 1
【经验分享】如何在IDEA中快速学习|审查|复习代码工程?
游客pyivdsdmxqiee
|
16天前
|
JSON Java Maven
IDEA开发过程中常用插件必备
本文介绍了提升IntelliJ IDEA开发效率的几个插件:Codota用于强大代码补全;Auto filling Java call arguments自动填充函数参数,节省手动填充时间;GsonFormat能快速将JSON转换为Java实体类;Rainbow Brackets帮助识别括号所属代码块;Maven Helper提供高效查看和分析Maven依赖树功能;Key Promoter X提醒使用快捷键代替鼠标操作;最后还分享了如何设置背景图片以提升编码心情。
游客pyivdsdmxqiee
48 0
讓丄帝愛伱
|
16天前
|
XML SQL Java
IntelliJ IDEA 插件 MybatisX 在mapper和xml间跳转
IntelliJ IDEA 插件 MybatisX 在mapper和xml间跳转
讓丄帝愛伱
167 0
威哥爱编程
|
16天前
|
人工智能 自然语言处理 Java
用智谱 GLM-4大模型开发自己的IDEA插件
V 哥建议研究大模型先从研究开放 API 开始,作为程序员的你觉对不是什么难事,通过研究 API 的过程中,可以让你更加了解大模型的原理,当然想要更深入的理解,需要对开源大模型的源码进行研究,根据个人的技术能力,量力而行。研究 API 是第一步,目前热招的岗位中,就有基于大模型开放 API 做应用开发的,大家可以在招聘站点上具体看看职位要求。
威哥爱编程
44 0
用智谱 GLM-4大模型开发自己的IDEA插件
默不会开发
|
16天前
|
安全 Java 数据库连接
在IntelliJ IDEA中通过Spring Boot集成达梦数据库:从入门到精通
在IntelliJ IDEA中通过Spring Boot集成达梦数据库:从入门到精通
默不会开发
67 6

热门文章

最新文章

  • 1
    8条经验轻松上手IDEA插件开发
  • 2
    Idea查看所有断点
  • 3
    Git进行协作开发与Idea的Git合并技巧
  • 4
    IntelliJ IDEA - 光标批量垂直连续选中(Alt + Shift + Insert)
  • 5
    Intellij IDEA 添加jar包的三种方式(转载)
  • 6
    Intellij idea设置支持TypeScript
  • 7
    Idea导出可运行jar包及运行方法
  • 8
    [工具](1)ItelliJ IDEA使用日记
  • 9
    Intellij Idea非常6的10个姿势!
  • 10
    idea快捷键总结
  • 1
    IDEA集成Docker插件打包服务镜像与运行【附Docker命令汇总】
    251
  • 2
    密码学系列之三:DES、AES、IDEA —— 一文搞懂分组密码
    217
  • 3
    【问题篇】git创建分支后idea切换分支找不到以及合并问题
    45
  • 4
    【问题篇】IDEA运行war包项目
    176
  • 5
    10 个解放双手的 IDEA插件,少些冤枉代码(第三弹)
    153
  • 6
    933.【开发工具】解决idea:Caused by: java.net.BindException: Add
    32
  • 7
    idea的Maven依赖问题
    83
  • 8
    GitHub排名第一《lntellij IDEA软件开发与应用实战手册》限时开源
    47
  • 9
    java集成opencv(不踩坑),实现人脸检测小demo(含上传人像图片识别接口),windows,IDEA,Springboot
    227
  • 10
    IDEA+Mysql调试常见异常解决办法_kaic
    32
  • 相关课程

    更多
  • Cloud Toolkit 开发部署效率提升神器
  • 物联网开发 - Linux驱动开发实操演练
  • 面向运维的 python 脚本速成-1024程序员节创造营公益课
  • 线上Linux服务器优化经验
  • 机器阅读技术与应用
  • 线上问题排查利器 Alibaba Arthas(上)
  • 相关电子书

    更多
  • 蚂蚁金服高级开发工程师萧恺:IDEA 插件开发入门教程
  • D2前端工程下一站 IDE ——上坡&吭头
  • D2前端工程下一站 IDE
  • 相关实验场景

    更多
  • 每个IT人都想学的“Web应用上云经典架构”实战
  • 语言入门-1:环境构建
  • 前端开发基础1:前端开发环境的安装和配置
  • 2分钟自动化部署人生模拟器
  • 代码质量提升小妙招
  • 基于函数计算快速搭建Zblog等传统应用框架
  • 下一篇
    2024年阿里云免费云服务器及学生云服务器申请教程参考

    深圳SEO优化公司淮安网站建设设计哪家好安康网络营销报价襄樊至尊标王大丰seo网站优化公司阜新关键词排名多少钱黄冈百度seo报价常州设计网站推荐防城港如何制作网站推荐南通网站制作设计报价丹东网站推广系统枣庄关键词排名报价陇南网络广告推广白银如何制作网站多少钱木棉湾网站关键词优化多少钱佛山百姓网标王推荐马鞍山百度竞价推荐红河建设网站多少钱肇庆企业网站制作价格文山SEO按效果付费价格楚雄建站价格成都网站开发多少钱常州网站推广方案公司阜新网站改版报价怀化企业网站改版沈阳SEO按天扣费推荐邵阳阿里店铺运营报价思茅阿里店铺托管推荐六安网站设计承德优化价格红河网站制作设计价格歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

    深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化