首页 >> 大全

代码结构

2023-06-19 大全 51 作者:考证青年

工作日志 常用快捷键篇idea字体常用设置异常报文格式化网站(xml,json,from)Linux日常 vi/vim命令 Linux部署war项目 在环境上重启core核心和inst南向服务挡板项目之报文与对象的互转 git拉代码篇maven 篇如何配置SSH Key和加速配置变量命名网址使用方法详解工具类工具使用清除系统缓存若依项目(微服务版)

代码结构 工具类的常用方法

在校验一个类型的变量是否为空时,常用方法。

.(),校验null、“”、" “、/n(换行符)、/t(制表符)、换页符、回车符。

.(), 判断制表符(\t)和” "时,为false。

工具类的常用方法

判断对象是否为空时,常用方法。

.(),判断是否空,既使已经分配内存,但没赋值,依然空。

.(),判断是否空,没有分配内存,可能空指针异常。

枚举类

package com.example.studyservice.enmu;import java.util.Arrays;public enum ActionEnum {/** 状态:动作,枚举:删除.DELETE,添加.ADD,更新.UPDATE */DELETE("DELETE", "删除"),ADD("ADD", "添加"),UPDATE("UPDATE", "更新"),QUERY("QUERY", "查询");private String code;private String desc;ActionEnum(String code, String desc) {this.code = code;this.desc = desc;}public String code() {return this.code;}public String desc() {return this.desc;}/*** 通过code获取desc** @param code code* @return desc*/public static String descOfCode(String code) {return Arrays.stream(values()).filter(it -> it.code().equals(code)).findFirst().map(a -> a.desc).orElse(null);}
}

-lang3工具包引用

<dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.9</version></dependency>

时间格式转化工具类

package com.example.studyservice.utils;import org.apache.commons.lang3.StringUtils;import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;public final class LocalDateTimeUtil {public static final String DATETIME_14 = "yyyyMMddHHmmss";public static final String DATETIME_17 = "yyyyMMddHHmmssSSS";public static final String DATETIME_19 = "yyyy-MM-dd HH:mm:ss";public static final String DATETIME_23 = "yyyy-MM-dd HH:mm:ss.SSS";public static final String DATETIME_24 = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'";public static final String DATETIME_24_H = "yyyy-MM-dd'T'HH:mm:ss.SSSZ";public static final String DATETIME_25 = "yyyy-MM-dd'T'HH:mm:ss";public static final String DATE8 = "yyyyMMdd";public static final String TIME6 = "HHmmss";public static final String TIME8 = "HH:mm:ss";public static final String DATE10 = "yyyy-MM-dd";private LocalDateTimeUtil(){}public static String formatDatetime() {return LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));}public static String formatDatetime(LocalDateTime localDateTime) {return localDateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));}public static String formatDatetime14(LocalDateTime localDateTime) {return localDateTime.format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"));}public static String formatDatetime17(LocalDateTime localDateTime) {return localDateTime.format(DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS"));}public static String formatDatetime24(LocalDateTime localDateTime) {return localDateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"));}public static String formatDatetime24h(LocalDateTime localDateTime) {return localDateTime == null ? null : ZonedDateTime.of(localDateTime, ZoneId.systemDefault()).format(DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSZ"));}public static String formatDatetimeMilli() {return LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS"));}public static String formatDatetimeMilli(LocalDateTime localDateTime) {return localDateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"));}public static String formatDate() {return LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));}public static String formatDate(LocalDateTime localDateTime) {return localDateTime.format(DateTimeFormatter.ofPattern("yyyyMMdd"));}public static String formatDate(LocalDateTime localDateTime,String format) {if(localDateTime == null){return LocalDateTime.now().format(DateTimeFormatter.ofPattern(format));}else {return StringUtils.isEmpty(format) ? formatDate(localDateTime) : LocalDateTime.now().format(DateTimeFormatter.ofPattern(format));}}public static LocalDateTime parseDate(String strDate, String format) {return strDate == null ? null : LocalDateTime.parse(strDate,DateTimeFormatter.ofPattern(format));}public static LocalDateTime parseDate(String dateStr) {return LocalDateTime.parse(dateStr,DateTimeFormatter.ofPattern("yyyyMMdd"));}public static LocalDateTime parseDatetime(String datetimeStr) {return LocalDateTime.parse(datetimeStr,DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));}public static LocalDateTime parseDatetime14(String datetimeStr) {return LocalDateTime.parse(datetimeStr,DateTimeFormatter.ofPattern("yyyyMMddHHmmss"));}public static LocalDateTime parseDatetime17(String datetimeStr) {return LocalDateTime.parse(datetimeStr,DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS"));}public static LocalDateTime parseDatetime23(String datetimeStr) {return LocalDateTime.parse(datetimeStr,DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS"));}public static LocalDateTime parseDatetime24h(String datetimeStr) {return LocalDateTime.parse(datetimeStr,DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSZ"));}public static String formatTime6(LocalDateTime localDateTime) {return localDateTime.format(DateTimeFormatter.ofPattern("HHmmss"));}public static String formatTime8(LocalDateTime localDateTime) {return localDateTime.format(DateTimeFormatter.ofPattern("HH:mm:ss"));}public static String formatDate(String format,LocalDateTime localDateTime) {if (localDateTime == null ) {return LocalDateTime.now().format(DateTimeFormatter.ofPattern(format));}else if (StringUtils.isEmpty(format)){return formatDate(localDateTime);}else {SimpleDateFormat simpleDateFormat = new SimpleDateFormat(format);return simpleDateFormat.format(localDateTime);}}public static String formatTime10(LocalDateTime localDateTime) {return localDateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));}public static String formatTime10(LocalDate localDate) {return localDate.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));}public static String convert24hto24(String str24h) {return formatDatetime14(parseDatetime(str24h));}public static String convert14to24h(String str14h) {return formatDatetime24h(parseDatetime(str14h));}
}

常用快捷键篇

截图工具

锁屏 +l

关闭当前网页 Ctrl+w

回到桌面 +d

显示所有窗口并进入(需求tab切换) Alt+Tab

显示所有窗口 +Tab

IDEA单词转大写 Ctrl+shit+u

IDEA 单词翻译插件

Debug快捷键 F7进入方法,F8当前下一步,F9跳过断点,ctrl+alt+l+左键(返回debug报错的地方)

Idea使用技巧—调试工具 。共支持两种模式:表达式模式、代码模式。

格式化报文格式

ctrl+a全选,alt+shift进行格式化

idea字体常用设置

异常

报文格式化网站(xml,json,from)

Linux日常 linux 常用命令

ll查看所有文件以及文件的格式,查服务日志拿请求报文

查看日志(cat,less,more) cat命令

#进入logs日志目录
cd /opt/huawei/logs/apps/FundCore/run
ll
#查看今天的日志
run.log
#通过tid去查报错的信息,查今天的日志
grep '12244234324324' run.log
# 进入月份目录去查以前的日志目录查询
cd 2022-05
# 查看日志命令之cat命令
#进入目录之后,通过cat命令去查日志。
cat 2022-05-01.log | grep 'chanele start'
#当找不到日志时知道直接可以直接调接口,tail -f查实时日子
tail-f  #会实时监控日志出来
#动态监控日志,如果想要在尾部出现想要的字符串时才打印,可以加上:| grep "查询字符串",“|”表示管道,意思是以前面的命令获取到的内容为目标,经过管道过滤出想要的内容。
tail -f run.log
# 动态监控500行日志
tail -f -n 500 run.log
# 查看进程,
ps -ef|grep nuwa

less命令

# 查日志命令二less
less run.log
#按End键到达文件尾部
#输入:?+想要查询的字符串+回车
#N键:上一次出现的地方;shift+N:下一次出现的地方
#通过这个条件去查日志
?chanele start 回车键

/ 字符串 向下搜索‘字符串’的功能

?字符串 向上搜索‘字符串’的功能

n:重复前一个搜索(与 / ?有关)

N:反向重复前一个搜索(与 / ?有关)

G 移到最后一行

g 移到第一行

h 显示帮助界面

q 退出less命令

u 向前翻半页

d 向后翻半页

b 或【up】向前翻一页

空格键 或 【down】 向后翻一页

ps查看进程信息并通过less分页显示

[root@linuxcool ~]# ps -ef |less 
[root@linuxcool ~]# history | less 
22  scp -r tomcat6.0.32 root@192.168.120.203:/opt/soft 23  cd .. 
24  scp -r web root@192.168.120.203:/opt/ 
25  cd soft  
……省略……
[root@linuxcool ~]# less log2018.log log2019.log 
# 当正在浏览一个文件时,也可以使用 :e命令 打开另一个文件
[root@linuxcool ~]# less file1
:e file2

more命令

more功能类似 cat ,cat命令是整个文件的内容从上到下显示在屏幕上。 more会以一页一页的显示方便使用者逐页阅读,而最基本的指令就是按空白键(space)就往下一页显示。

按 b 键就会往回(back)一页显示,而且还有搜寻字串的功能 。more命令从前向后读取文件,因此在启动时就加载整个文件。

more和less的区别?

在 more 的时候,我们并没有办法向前面翻, 只能往后面看,但若使用了 less 时,就可以使用 [] [] 等按键的功能来往前往后翻看文件,更容易用来查看一个文件的内容。

其中,cat命令是直接输出文件的全部内容,如果文件内容很多行,那么就会占满屏幕,很不方便查看。如果是好几GB的DNA序列文件,直接用cat命令就是一个灾难,这个时候就需要less和more来一页一页的查看文件了。

less的用法比起more更加的有弹性。在使用more的时候,翻页并不特别方便,但若使用了less时,就可以使用[](上一页) 和[](下一页) 等按键的功能来往前往后翻看文件,更容易用来查看一个文件的内容。因此大多数情况下推荐大家使用less查看文件。

在使用less命令时我更加习惯用空格键来往后翻页,使用b来往前翻页。如果需要退出则按q键就可以了。

less也具有灵活的查找功能,在使用less命令中输入斜杠“/”,就可以进入查找模式,斜杠后面跟你要查找的词。

加上“-N”参数可以显示每行的行号,“-m”可以显示类似more命令的百分比,方便查看文件时知道看到哪个位置了 less -Nm

vi/vim命令

搜索方式同less命令,把“?”查询改为“/”查询即可。

cd etc/pleay
#修改环境变量,比如改jdk环境变量

Linux部署war项目

先在本地idea把项把包,因为时是配置服务,需要打成war包,部署在linux服务上。

1.在idea里,mvn clean ,打成.war包。

2.使用sftp文件上传war包到环境上,rz,或者直接托进来。

3.记得先切换用户。不然上传的文件会直接到root路径下的。

4.如果忘记切换用户了,上传的文件找不到咋办?可以通过这个find ./-name war(文件名)命令去查找。比如find ./-name 。可以打印出这个文件的路径出来。如这个命令pwd

5.然后移动这个文件到指定的路径下,比如移动命令 mv .war /opt//

Linux装jdk

查看防火墙状态命令:

.

systemctl status firewalld.service

关闭防火墙

stop .

systemctl stop firewalld.service

创建文件夹

mkdir /usr/local/java

解压jdk安装包

tar -zxvf jdk-8u51-linux-x64.tar.gz

配置环境变量

vi /etc/

vi /etc/profile

#设定jdk环境

=/usr/local/src/jdk/jdk1.8

PATH= J A V A H O M E / b i n : /bin: JAVAH​OME/bin:PATH

=.:$/lib


#设定jdk环境
export JAVA_HOME=/usr/local/src/jdk/jdk1.8
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib

重启生效

/etc/

source /etc/profile

查看是配置成功

java -

java -version

Linux装

如何解决ssh连接Linux超时自动断开

#用以下命令判断是否设置了参数

echo $TMOUT

#如果输出为0或者表示不超时,

vi /etc/

TMOUT =900

#重启生效

/etc/

Linux创建新用户 Linux 命令之mv,cp

#移动命令,移动到这个路径下的文件夹mv mockServer.war  /opt/huawei/MockSuth
# 修改命令,修改这个文件名
mv mockServer.war mockServer01.war
# 复制命令,cp 复制这个文件到指定的文件路径下
cp mockServer.war  /opt/huawei/MockSuth

Linux 命令之chgrp文件分组,chown

chgrp 分组命令,chgrp 是英语单词“ group”的缩写,用来改变文件或目录所属的用户组。其中,组名可以是用户组的 ID,也可以是用户组的组名。文件名可以是由空格分开的要改变用户组的文件列表,也可以是由通配符描述的文件集合。如果用户不是该文件的文件主或超级用户(root),则不能改变该文件的所属用户组。

#指定哪个文件属于哪个用户的
#指定这个文件属于这个paymentchannel 用户的,ll查看一下有没有修改
chgrp paymentchannel mockServer.war

Linux chown(英文全拼: owner)命令用于设置文件所有者和文件关联组的命令,chown 需要超级用户 root 的权限才能执行此命令。chown更改每个给定文件的用户和/或组所有权。如果只提供了所有者(用户名或数字用户ID),则该用户将成为每个给定文件的所有者,并且不会更改文件组。如果所有者后跟冒号和组名(或数字组ID),且两者之间没有空格,则文件的组所有权也会更改。如果用户名后面有冒号,但没有组名,则该用户将成为文件的所有者,并且文件组将更改为该用户的登录组。如果给出了冒号和组,但省略了所有者,则只更改文件组;在这种情况下,chown执行与chgrp相同的功能。如果只给出一个冒号,或者如果整个操作数为空,则所有者或组已更改。

# 指定文件的主属
chown paymentchannel mockServer.war

部署并运行项目

# 删除文件,
rm -f mockServer.war
# 强制删除文件
rm -rf mockServer.war

进入bin目录运行或重启


#先切换用户身份   一般是root管理员,如果是root用户的话可能项目不能自动解包。
su paymentchannel 
ll
# 运行项目
sh startup.sh
# 停止运行项目
sh shutdown.sh

在环境上重启core核心和inst南向服务

进入项目部署的文件夹路径

获取南向的配置文件信息

cd /opt/huawei/apps/petalfunds/FundsPaymentChannelInstService/
#查看网关支付的密钥配置
cd confing
ll
cat gatewaypay.perpores
cd nuwa #进入路径下
cd bin#
#记得切换用户,su paymentchannel 
sh startup.sh
# 可以动态查看项目运行的日志
tail -f /opt/huawei/logs/FundsChannelCore/nuwacofig.out

挡板项目之报文与对象的互转 JSON格式报文转换

#从数据库中获取报文加签
Map<String,String> responseMap=JsonUtil.string2Obj(caseRulepo.getResponseContent(),new TypeReference<Map<String,String>>(){});
#json报文格式加签方法
public static String signJsonMsg(Map<String,String> map){
#获取公钥
String privateKey=configUtils.getProperty(CHANNEL_GATEWAYP)
String signAfter=null;
try{
//排序
String msg=RsaUtils.coverMap2String(map);
byte[] shaMsg=RsaUtils.fundsSha256(msg.getBytes(StandardCharsets.UTF_8));
signAfter=RsaUtils.signByRSA(shaMsg,privateKey,SIGN_ALGORITHM_SHA256RSA);
}catch (CipherRxception e){
}

XML格式报文转换

MessageRootVo msgRootVo=XMLUtils.convertXML2Object(MessageRootVo.class,body);
Map<String,String> rulesMap=new HashMap<>();
//签名方法
private String sign(String msg){
String privateKey=onfigUtils.getProperty(CHANNEL_GATEWAYP);
String signAfter=null;
try{
byte[] shaMsg=ShaUtils.sha256(msg.getBytes(StandardCharsets.UTF_8));
signAfter=RsaUtils.signByRSA(shaMsg,privateKey,SIGN_ALGORITHM_SHA256RSA);
}catch (CipherRxception NoSuchAlgorithmException e){
}

git拉代码篇

git的安装和拉代码

maven 篇

maven配置和使用

maven 打包命令

#跳过单元测试打包

mvn clean -.test.skip=true

#普通打包

mvn clean

#本地项目打包

mvn clean

如何配置SSH Key和加速配置

配置和加速

变量命名网址

命名

使用方法详解

工具类

判空函数

1).( str)

2).( str)

3).( str)

4).( str)

5).(… css)

6).(… css)

7).(… css)

8).(… css)

9).( cs)

= !, 同理;

容易忽略的;

大小写函数

  StringUtils.isEmpty("")        = true
.isEmpty("")        = true

isBlank和isEmpty区别```javaSystem.out.println(StringUtils.isBlank(" "));//trueSystem.out.println(StringUtils.isBlank("   "));//trueSystem.out.println(StringUtils.isBlank("\n\t"));//true//区别StringUtils.isEmpty(" ")       = false
.out.println(StringUtils.isBlank(" "));//trueSystem.out.println(StringUtils.isBlank("   "));//trueSystem.out.println(StringUtils.isBlank("\n\t"));//true//区别StringUtils.isEmpty(" ")       = false

和是多维判空,存在一个blank或者empty既true

  StringUtils.isAnyBlank("", "bar","foo");       = true//注意这两个区别StringUtils.isAnyEmpty(" ", "bar")       = falseStringUtils.isAnyEmpty(" ", "bar")       = true
.isAnyBlank("", "bar","foo");       = true//注意这两个区别StringUtils.isAnyEmpty(" ", "bar")       = falseStringUtils.isAnyEmpty(" ", "bar")       = true

= !;同理

  public static boolean isNoneBlank(CharSequence... css) {return !isAnyBlank(css);}
public static boolean isNoneBlank(CharSequence... css) {return !isAnyBlank(css);}

判断空白

  StringUtils.isWhitespace(null)   = falseStringUtils.isWhitespace("")     = trueStringUtils.isWhitespace("  ")   = true
.isWhitespace(null)   = falseStringUtils.isWhitespace("")     = trueStringUtils.isWhitespace("  ")   = true

注意点:

首字母大写,全部转化为大写,大小写互转;

  StringUtils.capitalize(null)  = nullStringUtils.capitalize("")    = ""//首字母转为大写StringUtils.capitalize("cat") = "Cat"//全部转为大写StringUtils.upperCase("aBc") = "ABC"//大小写互转StringUtils.swapCase("The dog has a BONE") = "tHE DOG HAS A bone"
.capitalize(null)  = nullStringUtils.capitalize("")    = ""//首字母转为大写StringUtils.capitalize("cat") = "Cat"//全部转为大写StringUtils.upperCase("aBc") = "ABC"//大小写互转StringUtils.swapCase("The dog has a BONE") = "tHE DOG HAS A bone"

.( str)

.( str)

.( str)

.( str, )

.( str)

.( str, )

.( str)

.( cs)

.( cs)

工具类

工具类

public static void identityToString(StringBuffer buffer, Object object)

        /*** 累加对象产生的toString* 两个参数任意一个为null都会抛出空指针异常* buffer-要追加的缓冲区* object-要创建对象的toString*/StringBuffer buffer = new StringBuffer();ObjectUtils.identityToString(buffer, "");ObjectUtils.identityToString(buffer, Boolean.TRUE);ObjectUtils.identityToString(buffer, 12);System.out.println(buffer);这里写代码片

public static void identityToString(StringBuilder builder, Object object)

        /*** 累加对象产生的toString,如果一个对象没有实现自己的toString方法将使用Object对象的toString* 两个参数任意一个为null都会抛出空指针异常* builder-要追加的缓冲区* object-要创建对象的toString*/StringBuffer builder = new StringBuffer();ObjectUtils.identityToString(builder, "");ObjectUtils.identityToString(builder, Boolean.FALSE);这里写代码片/*** 这个方法返回不变的值,这可以阻止编译器javac重新编译* 这种方法任何关联这个字段的jar包不需要重新编译,即使字段的值在将来改变*/public final static int MAGIC_INT = ObjectUtils.CONST(12);public final static long MAGIC_LONG = ObjectUtils.CONST(123L);public final static float MAGIC_FLOAT = ObjectUtils.CONST(123.0f);public final static double MAGIC_DOUBLE = ObjectUtils.CONST(1.0);public final static String MAGIC_STR = ObjectUtils.CONST("asfd");public final static char MAGIC_CHAR = ObjectUtils.CONST('a');public final static byte MAGIC_BYTE = ObjectUtils.CONST((byte) 127);public final static boolean MAGIC_FLAG = ObjectUtils.CONST(true);//不能小于-128或者大于127public final static byte MAGIC_BYTE1 = ObjectUtils.CONST_BYTE(127);//不能小于 -32768并且大于32767public final static short MAGIC_SHORT = ObjectUtils.CONST_SHORT(32767);public final static short MAGIC_SHORT1 = ObjectUtils.CONST((short) 123);这里写代码片

public static int compare(T c1, T c2)/*** 该方法是对NULL安全的比较方法,null是被假定为一个小于非空的值* c1-第一个被比较的值,可能为null* c2-第二个被比较的值,可能为null*/int result = ObjectUtils.compare(12, null);这里写代码片

public static int compare(T c1,T c2,boolean nullGreater)/*** 该方法是对NULL安全的比较方法,null是被假定为一个小于非空的值* c1-第一个被比较的值,可能为null* c2-第二个被比较的值,可能为null* nullGreater-如果为true,null被认为是一个大于非空的值或者false,null被认为是小于非空的值*/result = ObjectUtils.compare(null, 23, false);这里写代码片

工具使用

配置1:网关支付

清除系统缓存

# 
C:\Windows\system32>chkdsk
C:\Windows\system32>sfc/scannow

若依项目(微服务版)

1.准备的环境

jdk1.8,.7以上,本地安装redis,本地安装nocos,安装vue脚手架。

nacos安装

详见

redis本地安装

下安装redis,下载地址:上的下载包

redis官网下载地址:redis官网

进入redis包下的目录启动

E:\my_workapse\redis_workspace\redis>redis-server.exe redis.windows.conf

开启客户端连接redis

E:\my_workapse\redis_workspace\redis>redis-cli.exe

安装vue的脚手架

1.准备环境

构建Vue项目的npm+,地址:官网

官网:官网

node-v14.15.4-x64.msi

验证安装:

node -v     # v8.11.3,至少8以上,最新的是v15.11.0

npm config get registry # 查看当前配置的镜像,结果是默认的国外网址https://registry.npmjs.org/npm config set registry https://registry.npm.taobao.org #设置成淘宝镜像npm config get registry #再获取查看,结果是修改后的https://registry.npm.taobao.org/ 

-i 安装指令,全拼: install
-S 生产环境,全拼: --save
-D 开发环境,全拼: --save—dev
-O 可选依赖,全拼: --save—optional
-E 精确安装指定模块版本,全称:--save—exact
-g 全局安装,全拼: --global

脚手架安装:

npm install vue-cli -g #安装vue-cli脚手架---可能比较慢,要等几分钟npm uninstall vue-cli -g #卸载vue-cli脚手架 --- 大可不必vue –V #查看版本where vue #vue安装在哪里

进入工作空间目录:D:\\vue

cd jt01 # 进入项目目录

npm run dev # 自动启动服务,ctrl+c 停止,可能要等几分钟

关于我们

最火推荐

小编推荐

联系我们


版权声明:本站内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 88@qq.com 举报,一经查实,本站将立刻删除。备案号:桂ICP备2021009421号
Powered By Z-BlogPHP.
复制成功
微信号:
我知道了