开发工具分享
  • 首页
  • 计算科学
  • 文化旅游
  • 项目和网站
    • OSSEZ 计算技术
    • USRealEstate 社区
    • 地区文化
    • CWIKI.US
    • BUG.OSSEZ.COM
    • RSS.OSSEZ.COM
CWIKIUS.CN
一个有独立思考和温度的清新站
Computer Science

IntelliJ IDEA 重做快捷键和配置哲学

在开始使用 IntelliJ IDEA 的时候,有一组非常重要的快捷键你可能不太适应。 尤其是针对从 Eclipse 转移过来的用户。 那就是重做和撤销快捷键。Redo 和 Undo 。 快捷键 在 Windows 中,很多用户都知道撤销的快捷键是 Ctrl +Z,如果是重做的话,那快捷是 Ctrl + Y。 但是 IntelliJ IDEA 的重做快捷键却不是这么定义的,IntelliJ IDEA 定义 Ctrl + Shift + Z 为重做。 这就导致不少用户在转过来后一脸懵逼。 其实,你也可以在搜索上,搜索关键词 redo 和 undo 来了解 IntelliJ IDEA 定义的快捷键。     经过一段时间的了解,IntelliJ IDEA 的快捷键定义哲学应是尽量保持后面的字母不变,在不同功能切换中添加 Ctrl, Alt ,和 Shift 的组合。 比如说搜索对话框,基本上所有人都知道双击 Shift 可以打开搜索对话框。 如果是搜索 Classes,快捷键是 Ctrl + N 如果是搜索 Files,快捷键是 Ctrl + Shift + N 如果是搜索 Symbols,快捷键是 Ctrl + Alt + Shit + N 最后一个是 Action,Action 和 双击 Shift 打开搜索对话框的快捷键不一样,使用的是 Ctrl + Shift + A,使用 Action 的第一个字母。     从这里的配置,我们大致了解下 IntelliJ IDEA 的快捷键配置哲学就是尽量保持第一个和最后一个键位不变,在中间添加其他功能键,以便于你记忆。 https://www.ossez.com/t/intellij-idea/563  

2020年10月09日 0Comments 914Browse 0Like Read more
Computer Science

JUnit 5 测试 Spring 引擎的时候提示 junit-vintage 错误

在 Spring 项目中运行测试的时候,得到错误: TestEngine with ID 'junit-vintage' failed to discover tests” with Spring 这个错误的原因是 JUnit 的引擎,使用了 junit-vintage 引擎。 junit-vintage 是 Junit 4 中使用的引擎,如果你的项目使用了 Junit 5 的话,你需要在 spring-boot-starter-test 中将 JUnit 4 的引擎从测试中删除。 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> <exclusions> <exclusion> <groupId>org.junit.vintage</groupId> <artifactId>junit-vintage-engine</artifactId> </exclusion> </exclusions> </dependency> junit-vintage-engine 和 junit-jupiter-engine 有什么不同 junit-vintage-engine 是 JUnit 4 中使用的测试引擎。 junit-jupiter-engine 是 JUnit 5 中使用的测试引擎。 如果你的 Spring 项目使用的新的 Spring Boot 版本的话,你应该默认使用了 JUnit 5 的引擎,因此为了兼容性,你需要在 spring-boot-starter-test 这个 POM 引用的时候将 JUnit 4 的引擎去除掉。     上面的这个配置你可以尝试下能解决你的问题。   https://www.ossez.com/t/junit-5-spring-junit-vintage/562

2020年10月09日 0Comments 1043Browse 0Like Read more
Computer Science

IntelliJ IDEA 的 Spring 项目如何查看 @Value 的配置和值

当你打开项目或者项目中的文件的时候,如果你有 Spring 的 Value 的配置,Intellij 将会自动将参数替换为值。 如果你单击上面的值,那么这个配置参数将会显示为配置的参数名。     如果你还想显示值的话,你需要重新打开这个文件或者项目。 有没有什么快捷键可以快速进行切换。 快捷键 这个配置是在 Intellij 的 Code > Folding 中进行配置的。 快捷键是是 Ctrl + NumberPad + 快捷键是是 Ctrl + NumberPad - NumberPad +,这个键是数字小键盘上的 + 号 NumberPad -,这个键是数字小键盘上的 - 号     因为这个快捷键在小键盘上,因此可能你比较难找到。 我们在这里标识出来。     Intellij 的快捷键定义。   https://www.ossez.com/t/intellij-idea-spring-value/561

2020年10月09日 0Comments 658Browse 0Like Read more
Computer Science

Maven 编译拷贝资源的时候提示 UTF-8 编码信息

如下面的提示内容。 提示的是在拷贝资源文件的时候,因为没有指定编码,将会使用 UTF-8 对编码进行转换。 [INFO] Using 'UTF-8' encoding to copy filtered resources. [INFO] Using 'UTF-8' encoding to copy filtered properties files. [INFO] Copying 2 resources [INFO] Copying 2 resources [INFO] The encoding used to copy filtered properties files have not been set. This means that the same encoding will be used to copy filtered properties files as when copying other filtered resources. This might not be what you want! Run your build with --debug to see which files might be affected. Read more at https://maven.apache.org/plugins/maven-resources-plugin/examples/filtering-properties-files.html     解决办法 在你的 pom 配置文件中 maven-resources-plugin 插件配置中,添加一个 <propertiesEncoding>UTF-8</propertiesEncoding> 这个参数。如果你的 pom 配置文件没有配置过 maven-resources-plugin 插件的话,你需要将这个插件先添加进去。 具体的配置参数如下: <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-resources-plugin</artifactId> <version>3.2.0</version> <configuration> <propertiesEncoding>UTF-8</propertiesEncoding> </configuration> </plugin>     上图显示了需要的配置状态。   https://www.ossez.com/t/maven-utf-8/560

2020年10月09日 0Comments 614Browse 0Like Read more
Computer Science

Azure AD 获得 Token 的时候得到 invalid_scope 的错误

完整的错误信息如下: { "error": "invalid_scope", "error_description": "AADSTS70011: The provided request must include a 'scope' input parameter. The provided value for the input parameter 'scope' is not valid. The scope api://4ab1a0b7-da1d-423d-9fc3-e3a6fabd98af/access_as_user is not valid.\r\nTrace ID: 8a08a7db-d914-4012-8159-067fdc6e4900\r\nCorrelation ID: 78adae38-0ef1-4147-b30e-00e5e93bdac0\r\nTimestamp: 2020-10-07 19:42:27Z", "error_codes": [ 70011 ], "timestamp": "2020-10-07 19:42:27Z", "trace_id": "8a08a7db-d914-4012-8159-067fdc6e4900", "correlation_id": "78adae38-0ef1-4147-b30e-00e5e93bdac0" } 下图是我们发送的数据和返回的错误信息。     这里错误的关键因素是你的 scope 可能是你的 scope 已经注册了,但是在获得 token 的时候不能使用上面的 scope。 你需要将你的 scope 从 api://4ab1a0b7-da1d-423d-9fc3-e3a6fabd98af/access_as_user 修改为 api://4ab1a0b7-da1d-423d-9fc3-e3a6fabd98af/.default 上面修改表示的意思是,你只能使用以 /.default 结尾 来访问获得 token 字符串。     请比较上面的 scope 就比较明确的了解需要的。   https://www.ossez.com/t/azure-ad-token-invalid-scope/559

2020年10月08日 0Comments 808Browse 0Like Read more
Computer Science

Azure active directory 获得访问的 token

一直认为 Azure 的设计过于复杂,权限要求过多,就感觉是一群技术宅做的系统。相对 AWS 来说,更加喜欢 AWS 的功能设计。 但是因为工作需要又不得不使用 Azure,所以把使用过程中遇到的一些问题都记录下来,以期望能帮助有需要的人。 这篇文章主要用于介绍如何使用 postman 来获得 Azure active directory 的用户访问 token,这个步骤是使用 Azure 对用户鉴权使用的第一步。 确定 tenant Azure 允许你有多个 tenant,你可以在 Azure 的控制台中对 tenant 进行切换,这个是你需要做的第一步。确定你希望使用的 teant。 如果你还没有 tenant 的话,你需要创建一个 tenant。     当找到你需要的 Tenant 以后,你会获得一个 tenant ID,这个非常重要。 因为这个表示的是你 AD 的唯一标识,所以你需要记录下来。 Tenant ID 在你界面中的的 Tenant Information 里面     注册 APP 不管你使用任何类型的应用,你都需要先注册一个 APP。 单击左侧的注册 APP 按钮。     可以单击界面的上侧,注册一个新的应用。     在弹出的界面中,输入注册需要的相关信息。 注册的名字你可以自行定义,需要注意的是,你需要选择: Accounts in any organizational directory (Any Azure AD directory - Multitenant) and personal Microsoft accounts (e.g. Skype, Xbox) 这个注册选项。 假设,我们这里注册的应用是 WEB。     获得基本参数 当你注册成功后,你可以单击你的注册名,然后你将会看到注册的应用信息界面。 在这个界面中,你会得到 Application (client) ID Directory (tenant) ID Object ID 这几个参数,这几个参数对你来说非常重要,你需要保存下来。     设置 secrets 单击左侧的 Certificates & secrets,你将会看到密钥生成的界面。 在这里,你可以单击生成一个新的 Secret。 你可以不用给这个 secret 进行命名,你也可以命名你希望的名字。请注意将 secret 进行保存,因为下次你访问的时候,secret 就不会再显示了。     API 赋权 你需要确定 Microsoft Graph 有用户读取的权限。     如果没有这个权限的话,你需要单击上面的添加权限来将权限添加进来。     选择 Microsoft Graph 的选项,然后将用户的权限添加进来。     暴露 API 你需要将你的 API 进行暴露,允许进行访问。     你需要添加一个新的 Scope,在这里我们假设你添加了一个叫做 user.read 的 scope。 在弹出的界面中你可以输入你需要的选项。 你可以选择 Admins and users     修改 Manifest 这个配置参数你需要手动修改。 主要修改参数是:oauth2AllowImplicitFlow 修改为 true     至此,Azure 的配置已经完成了,下一步就是配置你的客户端进行测试了。 Postman 测试 可以通过 Postman 进行测试获得 token。 你有 2 种方法进行测试,我们测试的是不通过授权,直接通过 secret 来获得 token。 另一种方法,我们在其他方式中再进行测试。 在 Postman 中添加一个 API 访问。 访问方法 使用 GET 进行访问 访问 URL 访问的 URL 是:https://login.microsoftonline.com/tenant ID/oauth2/v2.0/token 这里有一个参数要进行替换,就是 Tenant ID,这个 ID 在开始的时候就用于标识一个 AD,我们已经在前面的步骤保存了。 Headers 添加参数 Content-Type 为 application/x-www-form-urlencoded     Body grant_type : client_credentials client_id: 4ab1a0b7-da1d-423d-9fc3-e3a6fabd9 client_secret:SYk.HZT_jK6ZE1~3tle2Ha0MeV.9 scope: api://4ab1a0b7-da1d-423d-9fc3-e3a6fabd9/.default 这里参数有一根需要注意的地方。 client_id 是我们在最开始的时候 APP 创建成功后获得 client_id。 client_secret 是我们我们在 APP 注册成功后,创建的秘钥。 scope:是我们创建的的 scop,但是需要注意的是,我们创建的 scope 是以 user.read 结尾的,在我们获得 token 的时候,不能使用上面结尾的 scope,而需要将 user.read 修改为 .default 因此 scope 的配置就是 api://client_id/ .default. 请注意,你一定要这么配置,否则你拿不到 token 当一切配置好后,你可以发送请求,如果一切正确的话,你将会看到服务器返回给你的 token 字符串。   https://www.ossez.com/t/azure-active-directory-token/558

2020年10月08日 0Comments 690Browse 0Like Read more
Computer Science

Discourse 如何进行重启

Discourse 是使用基于 Docker 技术进行构建的。 因此在通常情况下,如果你需要对 Discourse 进行重启的话,你需要进入 docker 容器里面,然后进行重启。 通常可以使用下面的命令: cd /var/discourse ./launcher enter app sv restart unicorn 我们通过执行上面的命令后可以完成 Discourse 的重启。 [root@www ~]# cd /var/discourse/ [root@www discourse]# ./launcher enter app root@vps-f2a02f66-app:/var/www/discourse# sv restart unicorn ok: run: unicorn: (pid 154799) 0s root@vps-f2a02f66-app:/var/www/discourse# 上面的命令中 ./launcher enter app 是进入 docker 容器的命令。 sv restart unicorn 这个命令实际上是在容器内执行的,告诉 docker 对容器进行进行重启。

2020年10月06日 0Comments 948Browse 0Like Read more
Computer Science

CentOS 8 Apache 启用 SSL

在 CentOS 8 安装成功后,如果希望启用 ssl,你需要执行下面的一些操作。 安装 mod_ssl 使用下面的命令安装 mod_ssl # dnf install mod_ssl 确定 mod_ssl 被启用 这一步不是必须的,但是你可以使用下面的命令确定安装的 mod_ssl 已经被启用了。 apachectl -M | grep ssl 服务器可能会返回: 类似上面的情况和内容,你可以通过上面的返回确定 ssl 已经被启用了。 防火墙启用 443 端口 如果已经安装了防火墙的话,你需要为你的防火墙开放 443 的端口。 需要执行下面的命令: firewall-cmd --zone=public --permanent --add-service=https firewall-cmd --zone=public --permanent --add-port=80/tcp firewall-cmd --reload systemctl restart firewalld 配置虚拟主机 如果你的 Apache httpd 服务使用了虚拟主机,你可以在下面的文件中配置你虚拟主机的信息。 /etc/httpd/conf.d/ssl.conf 在上面的配置文件中,需要设置 key 和 crt 信息,请参考网络上的配置。 通过上面的步骤,就完成了在 CentOs 8 的 httpd 服务器上配置使用 ssl 的所有内容。步骤比较简单,只需要按照上面的顺序就可以完成了。   https://www.ossez.com/t/centos-8-apache-ssl/554

2020年10月06日 0Comments 627Browse 0Like Read more
Computer Science

CentOS 8 启用 NTP 服务

NTP 服务是什么和为什么我们需要在我们的服务器启用 NTP 服务? 可能很多人都不是非常了解,简单来说就是我们希望我们服务器的时间是准确的没有偏差的。这个的意义在数据插入和你程序取得计算机时间的时候是准确的。 比如说在 java 中如果 new date() 将会获得计算机当前的时间,如果当前的世界不准确的话,那么你插入数据库的时间就是混乱的。 同时,我们也希望我们的服务器的时区是准确的,比如说我们常使用的东八区和美国太平洋时间等。 如果计算机有什么原因导致时钟慢了,我们可以通过 ntp 进行同步。 所以针对服务器来说,在设置好时区后,NTP 服务是必须要启用的。 NTP 介绍 网络时间协议,英文名称:Network Time Protocol(NTP)是用来使计算机[时间同步化的一种协议,它可以使计算机对其服务器或时钟源如石英钟,GPS等等)做同步化,它可以提供高精准度的时间校正(LAN上与标准间差小于1毫秒,WAN上几十毫秒),且可介由加密确认的方式来防止恶意攻击。 NTP 的目的是在无序的 Internet 环境中提供精确和健壮的时间服务。 NTP 提供准确时间,首先要有准确的时间来源,这一时间应该是国际标准时间UTC。 NTP 获得 UTC的 时间来源可以是原子钟、天文台、卫星,也可以从Internet上获取。这样就有了准确而可靠的时间源。时间按NTP服务器的等级传播。 按照离外部 UTC 源的远近将所有服务器归入不同的 Stratum(层)中。Stratum-1在顶层,有外部 UTC 接入,而 Stratum-2 则从 Stratum-1 获取时间,Stratum-3从Stratum-2获取时间,以此类推,但Stratum层的总数限制在15以内。 所有这些服务器在逻辑上形成阶梯式的架构相互连接,而Stratum-1的时间服务器是整个系统的基础。计算机主机一般同多个时间服务器连接, 利用统计学的算法过滤来自不同服务器的时间,以选择最佳的路径和来源来校正主机时间。即使主机在长时间无法与某一时间服务器相联系的情况下,NTP服务依然有效运转。 为防止对时间服务器的恶意破坏,NTP使用了识别(Authentication)机制,检查来对时的信息是否是真正来自所宣称的服务器并检查资料的返回路径,以提供对抗干扰的保护机制。NTP时间同步报文中包含的时间是格林威治时间,是从1900年开始计算的秒数。 安装 NTP 服务 在 CentOS 8 中,我们使用 chronyd 来提供 NTP 的服务。 在 CentOS 上执行下面的命令来进行安装,如果你已经安装过的话,系统会进行提示。 dnf install chrony 开启启用 NTP 服务 在 CentOS 8 中,执行下面的命令,来让服务进程随开机自动启动。 systemctl enable chronyd 上面的命令会随计算机开机的时候自动运行。 检查服务器 NTP 服务器地址 请执行下面的命令,确定 NTP 服务器的地址已经配置成功了。 chronyc sources 上面命令会显示默认配置的 NTP 服务器地址。     强制同步 在安装操作系统后,可能会遇到时间不准确的情况。 可以使用下面的命令对服务器的世界进行强制同步一次。 chronyc -a makestep 服务器的输入内容是: [root@vps-c853c8ac home]# chronyc -a makestep 200 OK [root@vps-c853c8ac home]# 然后可以在服务器上执行 date +%z 以确定当前的时区和你可用使用 date 确定当前服务器的时间。 date 通过这个设置,我们就可以在服务器上使用 NTP 进行同步了,你就不需要对服务器的时间进行调整了。 https://www.ossez.com/t/centos-8-ntp/555

2020年10月06日 0Comments 614Browse 0Like Read more
Computer Science

Discourse 如何使用命令行方式进行恢复

本文主要用于说明如何从命令行工具的方式中恢复 Discourse,以及我们在备份和恢复的过程中遇到的坑和解决办法。 恢复前需要的准备工作 在新服务器上安装完整和全新的 Discourse,这个安装成功后不需要通过 UI 前台进行用户注册。 备份和获得备份文件。 确定你现在运行的 Discourse 版本是最新的版本,如果你的 Discourse 不是最新的版本,你需要先进行升级。 安装权限的 Discourse 因为 Discourse 必须使用域名公共网络访问才能完整安装。如果你的站点比较大的话,你需要考虑这个问题。你需要考虑修改 DNS 的配置,让你的 Discourse 能够通过公共网络访问,或者你的域名将会在访问的时候出现你 Discourse 正在安装的提示。 这部分的操作按照完整的 Discourse 安装方式进行就可以了,你不需要进行任何操作,你也不需要在安装成功后注册管理员账号。 请注意安装次数,如果你是使用 Let’s Encrypt 的签名的话,你的 CA 签名是有次数限制的。最多可以重新安装 5 次,否则你需要再等 5 天。 除非使用自己的签名。 这个问题的讨论,请参考下面的链接:Discourse 如何不使用 Let's Encrypt 而使用 CA 签名的密钥进行安装 备份和获得备份文件 Discourse 可以使用混合附件存储方式。这个方式的定义是部分附件存储在本地,部分附件存储在云上,最常用的服务就是 AWS 的 S3 服务。 因为这种方式,会导致在恢复的时候,可能出现数据错误,绝大部分情况就是因为有部分附件在本地,有部分附件在 S3 ,但是你的 Discourse 已经全部使用 S3 了,这会导致在恢复的时候提示 S3 校验失败的情况。 在进行备份恢复之前,你需要将你的 Discourse 再备份一次。通常可以直接点后台的备份按钮。 如果你的备份是上传到 S3 的话,你可以直接到 AWS 上将备份文件下载到本地。 如果你是混合存储文件的话,在这里 不要备份附件 否则你没有办法恢复你的备份文件。   如上图我们的内容,找到最新的备份文件,然后下载。 传输备份文件到新服务器 SSH 到你需要恢复的服务器上,如果你的服务器上没有下面的目录的话,你需要使用下面的命令创建一个: mkdir -p /var/discourse/shared/standalone/backups/default 上传你下载的备份文件到这个目录中。如果你是在服务器直接进行数据传输的话,你可以使用下面的命令,下面命令是帮助你 SSH 到老服务器,然后将老服务器上的备份传输到新服务器上。 scp /path/to/backup/backup.tar.gz root@192.168.1.1:/var/discourse/shared/standalone/backups/default 参数说明: /path/to/backup/backup.tar.gz 这个是你老服务器上备份文件的路径和文件名 192.168.1.1 这个是你老服务器的 IP 地址,你需要根据你的实际情况进行更改 你也可以使用 FTP 将备份上传到指定的目录。 我们最终的目的就是需要将你的备份文件存储到路径 /var/discourse/shared/standalone/backups/default 中。 恢复备份 依次执行下面的命令,首先你需要进入你新服务器的 Discourse 安装目录中: cd /var/discourse 然后通过下面的命令,进入到 Discourse 已经运行的容器,下面的操作其实是针对 Discourse 容器的操作。 ./launcher enter app 针对 Discourse 的实例,你需要启用恢复功能,因为这个功能在安装后的默认情况下是禁用的。 discourse enable_restore 恢复备份文件,直接执行下面的命令进行恢复就行。在这里只需要指定文件名就行,你不需要指定特定的路径,因为在 Discourse 容器中,默认会到上面你存储的文件路径中去找你的备份。 discourse restore sitename-2019-02-03-042252-v20190130013015.tar.gz 需要注意的是,上面的参数是示例参数,你需要根据你具体的情况替换掉备份文件的名字。 如果你在这里数据恢复成功的话,你将会在界面的下面看到 [Success] 的提示。否则将会提示失败,在失败的上面将会提示你失败的原因,你可以根据失败的原因重新调整参数后再重试,很多时候主要是附件的原因。 重构 Discourse 退出 Discourse 的容器,你可以使用命令 exit,然后你会界面中看到 bye 的容器退出提示。 然后在操作系统中的 Discourse 目录中,运行下面的命令,对 Discourse 进行重构。 cd /var/discourse ./launcher rebuild app 如果你希望对你新的实例进行调整的话,比如说修改邮件地址,增加容器配置参数,修改 app.yml 文件,在重构之前,你可以对上面的内容进行后再进行重构。 踩过的坑 下面是我们在备份恢复的时候踩过的坑和发现的问题: S3 混合存储无法恢复数据 在备份的时候,因为混合模式没有办法恢复数据。 需要修改备份方式不备份附件,只备份数据库。 文件权限 文件权限问题。 需要使用 sudo 方式,让安装程序自行确定文件和文件夹的权限,避免权限不足。 无法发送邮件 备份恢复后无法发送邮件。 开放防火墙端口,同时需要将内部配置中的允许发送邮件的域名设置一个,然后再撤销。 CA 无法签名 新实例安装过多,导致无法 CA 签名。 注意恢复次数和必要的时候使用自己的域名签名。   https://www.ossez.com/t/discourse/553

2020年10月06日 0Comments 604Browse 0Like Read more
1…185186187188189…309
Archives
  • July 2026
  • June 2026
  • May 2026
  • April 2026
  • March 2026
  • February 2026
  • January 2026
  • December 2025
  • November 2025
  • October 2025
  • September 2025
  • August 2025
  • July 2025
  • June 2025
  • May 2025
  • April 2025
  • March 2025
  • February 2025
  • January 2025
  • December 2024
  • November 2024
  • October 2024
  • September 2024
  • August 2024
  • July 2024
  • June 2024
  • May 2024
  • April 2024
  • March 2024
  • February 2024
  • January 2024
  • December 2023
  • November 2023
  • October 2023
  • September 2023
  • August 2023
  • July 2023
  • June 2023
  • May 2023
  • April 2023
  • December 2022
  • November 2022
  • October 2022
  • September 2022
  • August 2022
  • May 2022
  • April 2022
  • March 2022
  • February 2022
  • January 2022
  • December 2021
  • November 2021
  • October 2021
  • September 2021
  • August 2021
  • July 2021
  • June 2021
  • May 2021
  • April 2021
  • March 2021
  • February 2021
  • January 2021
  • December 2020
  • November 2020
  • October 2020
  • September 2020
  • August 2020
  • July 2020
  • June 2020
  • May 2020
  • April 2020
  • March 2020
  • February 2020
  • January 2020
  • December 2019
  • November 2019
  • October 2019
  • September 2019
  • August 2019
  • July 2019
  • June 2019
  • May 2019
  • April 2019
  • March 2019
  • February 2019
  • January 2019
  • December 2018
  • November 2018
  • October 2018
  • September 2018
  • August 2018
  • July 2018
  • June 2018
  • May 2018
  • April 2018
  • March 2018
Categories
  • Computer Science (2,385)
    • Confluence (663)
    • Gradle (12)
  • U.S. (557)
  • 文化旅游 (146)

COPYRIGHT © 2020 CWIKIUS. ALL RIGHTS RESERVED.

THEME KRATOS MADE BY VTROIS

湘ICP备2020018253号-1