部署教程
  开发者客栈 2023年12月29日 3611 20

体验地址:http://opensource.developers.pub

一 准备工作

  • 本地有Java运行环境,要求 Java8 及以上版本:运行项目使用
  • 本地安装 maven下载项目依赖使用
  • 有可以连接的数据库,要求 mysql6.0 及以上版本:保存服务数据使用
  • 本地有安装 git 客户端:从 github 下载代码使用
  • 服务器部署必须,本地不需要】安装 nginx配置服务访问路径使用

二 本地启动项目

2.1 下载代码

从github下载代码到本地,github 仓库地址:https://github.com/Qbian61/forum-java,进入到某个自己的项目工作文件夹下,执行下面的 clone 命令,将 github 代码下载到本地:

git clone git@github.com:Qbian61/forum-java.git

执行后效果如下图所示:

66998a5035f946aab1d611ef1f03319c

2.2 编辑器打开项目

我用的编辑器是 idea,大家根据自己平时的开发习惯使用对应的编辑器就好。

idea 打开项目如下:

dfe98951937b47a7a60e2d771c90dbf5

默认打开的是项目的 readme 文件,下面还有提示一些报错信息,报错说是我的本地maven配置的仓库地址不存在,所以需要修改下maven配置。

可以打开自己的编辑器的 preferences,搜索 maven,修改自己的 maven 配置,如下图:

a56da8c315ae452a87e32bd967011547

e2ac5332afa34999b5005a4e58e1814f

修改好 maven 配置后,打开项目的启动入口类,可以看到依赖的Spring包都没有下载下来,这个时候我们打开编辑器的maven控制台,点击左上角的刷新按钮,手动触发下依赖包的下载:

2d2f41333f6a47f6b3e209d278501897

刷新后可以看到项目的依赖包都已经下载下来了:

ada7c2d6a7934de8b62052a734501796

2.3 修改配置信息

这个时候还不能启动项目,需要先找到项目的配置文件,根据自己环境修改下配置信息。配置文件如下图所示:

50c282bae9a24490b20ef054d1de6fbf

配置文件有五个,接下来我们一一说明下每个文件的作用:

2.3.1 application.properties配置详解

5615048364144a43a6d429869a7427f3

下面这几项配置不需要我们修改,如果有人需要修改服务启动端口,需要修改多处,后面我们再说怎么修改端口:

server.port=8080 mybatis.config-location=classpath:mybatis/mybatis-config.xml mybatis.mapper-locations=/mapper/*.xml spring.thymeleaf.cache=true spring.servlet.multipart.max-file-size=3MB

下面这几项配置是数据库链接的配置,按照自己的数据库去配,不做过多说明:

spring.datasource.url=jdbc:mysql://127.0.0.1:3306/developers?useUnicode=true&characterEncoding=UTF-8&useSSL=false&useAffectedRows=true spring.datasource.username=root spring.datasource.password=mysql password

下面这几项配置是准备接入163邮箱发送的配置,功能代码已经开发好了,但是因为自己的163邮箱邮件发送的配置不对,所以发送邮件的功能也就被注释掉了,这里不需要配置,配置了也没用,有二开的同学可以根据自己的需要去修改这部分功能:

custom-config.mail.smtp.host=smtp.163.com custom-config.mail.smtp.port=465 custom-config.mail.smtp.socketFactoryPort=465 custom-config.mail.smtp.auth=true custom-config.mail.smtp.account=15620608572@163.com custom-config.mail.smtp.password=account login password custom-config.mail.smtp.fromAddress=开发者社区 <15620608572@163.com>

下面的这几项配置是七牛云图片存储的配置,文章内的图片上传会使用到这里,如果使用的是其他云存储,可以自己实现下图中的接口,例如可以将图片保存到服务器本地。

custom-config.upload-file.qiniu.accessKey= custom-config.upload-file.qiniu.secretKey= custom-config.upload-file.qiniu.bucketName= # 访问域名,例如 https://static.developers.pub/ custom-config.upload-file.qiniu.accessDomain=

a875c795887d4c94a9e0147341bba470

下面的这几项配置都是和页面显示相关的,需要自己根据自己的网站去个性化配置,每个配置都有配置说明,看备注一个个改下就好了。

# 全局页面配置 =》网站名称 custom-config.view.global.websiteName=开发者客栈 # 全局页面配置 =》网站 logo url custom-config.view.global.websiteLogoUrl=https://static.developers.pub/logo.jpeg # 全局页面配置 =》网站 favicon icon url custom-config.view.global.websiteFaviconIconUrl=https://static.developers.pub/favicon.ico # 全局页面配置 =》联系我 wx qr code img url,不配置 contactMeWxQrCode 时不现实 custom-config.view.global.contactMeTitle=联系我 - 官方微信 custom-config.view.global.contactMeWxQrCode=https://static.developers.pub/wx_qa_code.jpeg # 全局页面配置 =》分页大小 custom-config.view.global.pageSize=20 # 全局页面配置 =》图片访问时样式,访问cdn图片时,可自定义压缩格式 custom-config.view.global.cdnImgStyle=?imageView2/2/w/700 # 首页侧边栏类型 names custom-config.view.index-page.sidebar-type-names=公告,活动 # 全局页面配置 =》页面底部网站建站年份 custom-config.view.global.websiteStartYear=2016 # 全局页面配置 =》页面底部网站备案号 custom-config.view.global.websiteRecord=皖ICP备17014120

下面的是github授权登录的配置,需要用到 github 授权登录的可以配置下,不需要的话可以把登录框的三方授权隐藏掉。

# github 授权登录 client id custom-config.view.global.githubClientId= # github 授权登录 client secret custom-config.oauth.github.clientSecret=

f45d71ce1927417cbd73f428056b3de3

2.3.2 application-qa.properties配置详解

下面的配置是qa环境的配置,在本地启动的话,可以修改配置为本地参数,例如连接本地数据库等。

spring.datasource.url=jdbc:mysql://127.0.0.1:3306/developers?useUnicode=true&characterEncoding=UTF-8&useSSL=false&useAffectedRows=true spring.datasource.username=root spring.datasource.password=root spring.thymeleaf.cache=false

怎么让上面的配置生效呢,需要我们修改下项目启动配置的,如下:

50ae54792b154200b0475fad7459cbc8

c9cc45f992fe4101b99a7dd44f266204

c893972b8c0c477aa7467dd2a9ae2960

2.3.3 logback.xml配置详解

下图是 logback 日志框架的配置,里面包含了日志文件保存的路径,这个路径需要按照自己的运行环境进行修改,注意该路径需要给项目赋予可写的权限

827ffc4121a94969980336119ccb3b92

2.3.4 schema.sql配置详解

下图是数据库表的ddl配置,项目启动前需要创建数据库,并执行下面的sql初始化表结构。数据库名称可以看上面的数据库配置链接,可根据自己的数据库并进行修改。

5a9e1b90e95d444aaccc35201f96fb12

2.3.5 data.sql配置详解

下图的配置是初始数据的配置,会初始化一个超级管理员、一个管理员这两个账号,用户登录管理后台和管理内容使用。

498ac7b091024418b2ff5490cfa2a2d5

2.4 初始化数据库

2.4.1 创建数据库

创建一个数据库名为 forum-java的数据库,并选择对应的编码方式。

6ca15ad76ebd4889909c65adee9ce0f2

注意这里的数据库名要和上面的数据库链接里的数据库名对应,所以数据库链接中的数据库名也需要修改为 forum-java

spring.datasource.url=jdbc:mysql://127.0.0.1:3306/forum-java?useUnicode=true&characterEncoding=UTF-8&useSSL=false&useAffectedRows=true

2.4.2 初始化数据表

mysql workbench 太难用了,换了个mysql客户端工具 navicat,下面的操作都是基于navicat进行的。选中我们建好的数据库,右键运行sql文件,找到项目中的 schema.sql,执行建表ddl。

c84098dd14bd450ca9b9382941f6a790

be9865a7df8d4a0da02513531025f20b

执行完成后刷新数据库,就可以看到我们新建的数据表了。

33119e370e6948bf97205b0e517168eb

2.4.3 初始化数据

选中上面的数据库,右键继续执行sql文件,执行 data.sql 文件初始化数据,这里会初始化两个管理员账号

账号 登录密码
admin@developers.pub admin123456
superadmin@developers.pub admin123456

如下图所示:

e8d3d159ed244cc389cb9d3f6946514c

2.4.4 修改项目数据库连接

连接到刚刚创建的数据库。

fe1e5779696849a4990646c5ba402593

2.3 本地启动服务

上面的 2.3.2 中配置好了启动参数,我们直接点击idea右上角的小虫子 debug 模式启动服务。如下图表示服务启动成功。

ceee33e06e9740838e8d6cecd3c60896

2.4 访问本地服务

从上面的服务启动日志可以看到,我们的服务启动的端口是 8080,所以我们直接访问本地的 http://127.0.0.1:8080/ 就可以访问到启动的服务了,如下图:

ad685c4080cd42a8826257240c85ecbe

2.5 管理员登录

管理后台代码已经全部开源在 github(https://github.com/Qbian61/forum-java),拉下最新代码!!!

点击右上角登录,如下图:

1b00288c719646379a9dfd3d1da3cf72

超级管理员登录,如下图:

账号 登录密码
admin@developers.pub admin123456
superadmin@developers.pub admin123456

05f91219f39741389160cf8d58e82322

登录成功后可以看到右上角的用户头像,点击下拉可以看到管理后台访问入口,只有管理员登录才会出现管理后台,这里做了权限的区分:

5edc6f857a4a4323a24d2a73c8e064c2

2.6 访问管理后台

  • 回到浏览器,管理员登录成功后,访问 http://127.0.0.1:8080/admin地址,就可以进入管理后台了,如下图:

df8ef725251440b185b0b5cd6a671c91

  • 初始化的两个管理员用户

fc11d00556634b38839de48bdcf0a6da

  • 刚刚登录的操作日志

d30adadc11714aa0ba68688ddd974c70

  • 初始化的文章类别

52743bf399ce4b2cb267f4f551d7b2b8

  • 初始化的标签数据

ab395e72591842fa945a91fac33d94ed

到这里就完成了本地的服务配置和启动,管理后台也部署成功了。

接下来就让我们看下怎么将服务部署到服务器,让互联网上的其他人也能够访问到你的网站。

三 服务器部署

我的服务器操作系统是 Centos7,下面的步骤都是基于 Centos7操作系统下进行的操作。

3.1 服务器安装jdk8

  • 查看下yum源中是否有jdk安装包,如下图:
yum -y list java*

9caee4ce830345eabb9214da6d740deb

  • 下载安装jdk8,这里注意安装的版本:
yum -y install java-1.8.0-openjdk-devel.x86_64

b09c396004264365828828eaf13324c3

  • 下图可以看到我们的安装路径:

958b370902ba48d0ba317dbad99019b0

3.1.1 配置Java环境变量

  • vi /etc/profile 命令打开配置文件,添加下面的配置项,这里根据自己的安装路径配置:
#java JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.312.b07-1.el7_9.x86_64 JRE_HOME=$JAVA_HOME/jre PATH=$PATH:$JAVA_HOME/bin CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar export JAVA_HOME export JRE_HOME export PATH export CLASSPATH
  • 配置完成后执行下 source /etc/profile命令,使上面的配置生效。
  • 执行 javacjava -version 命令查看是否安装成功,如下图:

4b74a9477c204319b4fa1e76cc297c31

3.2 安装tomcat服务器

我部署的服务都是用的 tomcat 容器启动的,并没有用到 spring bootjar 包自带的服务器,所以我会在自己的服务器上安装一个 tomcat服务器,这样我每次发布部署的时候,只需要在本地打好 war 包,通过 scp 命令上传到服务器 tomcatwebapps 目录下,tomcat 会自动发布最新的 war 包,完成自动部署。

  • 我本地有下载好的tomcat安装包,所以就通过 scp 命令直接上传到服务器指定路径下了:

0f98b1f0a8194ce688e9943473158c98

  • 进入到服务器的tomcat包路径,执行 tar -zxvf apache-tomcat-9.0.6.tar.gz解压tomcat,如下图:

ea7805b2d4934d81b85217d5bc94e437

  • 进入 tomcat 的 conf 路径下,查看 server.xml 文件查看tomcat 启动端口号:

3e7b0b5c9cca40a0b2fd0212c497a64b

如果有需要修改的同学可以修改这里的端口号。

  • 进入到tomcat的 bin路径下,执行 ./startup.sh 命令启动tomcat服务器,如下图所示:

fd19176b0ac54a0e85f9ad9d8d432a5f

  • 上图表示启动成功了,我们通过服务器的ip+tomcat的启动端口访问下 http://42.51.0.196:8080/,如下图:

6e28ba9ef87a4bc4b55586593c1b1fd5

为了保险起见,建议把tomcat的webapps下自带的服务删掉

3.3 安装数据库mysql

  • 配置Mysql 8.0安装源,如下图:
sudo rpm -Uvh https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm

03a333b370db47faa80a12f9258560ac

  • 安装Mysql 8.0,如下图:
sudo yum --enablerepo=mysql80-community install mysql-community-server

4c07f35cbfab42f3b97f66441b8c476c

481c0f1399e447dc9f89818e3cebbec4

  • 启动数据库,如下图:
sudo service mysqld start

1b699d6b37fa441683fecfdf59a7682e

  • 查看mysql运行状态,如下图:
service mysqld status

6f5a3341956a4155a7b71cca35934d3e

  • 查看root临时密码,如下图:

安装完mysql之后,会生成一个临时的密码让root用户登录

grep "A temporary password" /var/log/mysqld.log

43184a66c3eb4494bef3e8f5ccdf30a1

  • 更改登录密码,如下图:

输入:mysql -uroot -p
在Enter password:后面输入临时密码

登录成功,输入:

ALTER USER 'root'@'localhost' IDENTIFIED BY 'new password';

e1c6b7727a8d43a7983fca00fca028ee

  • 查看用户,如下图:
mysql> use mysql; mysql> select host, user, authentication_string, plugin from user;

d5b676fb1e1b421f9de30ec7c8946095

发现root的host是localhost,不是%,可以加个host是%的root账号:

  • 更新root用户可远程连接,如下图:
update user set host = '%' where user = 'root';

4eef1f03b47041adbc345cdcde6476e2

  • 刷新下配置,如下图:
flush privileges;

cf64750e87c446f39b5020ea971e38d2

  • 通过mysql客户端连接刚部署的数据库,如下图:

5143dfa724dc48bcbe0785520e9875b3

  • 初始化项目数据库及数据,参考 2.4;

3.4 部署服务到服务器

3.4.1 修改项目中数据库配置为服务器数据库配置

03b711baa1374d549d58cfb2887f94ca

3.4.2 在服务器创建日志文件路径

e413e67e224342cf9f5a88530a431d1b

3.4.3 将本地项目打 war 包

  • forum-starter/pom.xml 的下图中的两处注释解开;

4f9075a47a7447e999be00e5fe0ff995

  • 打开控制台,mvn clean 清除下之前的编译文件;

66ade8572b3147d89dd1410043ee20ed

0def483904954a0fa38377d36e7cbd6b

  • 执行 mvn package 命令将项目打成 war 包;

d00914218e2046c18f01d8a25348fa15

806ef74207ca4988aab68b6e2bf9bd04

  • 查看打好的 war 包;

f27daff1de204811a96c8b19b9c19cd4

  • 将打包的 war 包上传到服务器的 tomcat/webapps 目录下
scp ./forum-starter/target/forum-java.war server_user_account@42.51.0.196:/home/apache-tomcat-9.0.6/webapps

6f6db9d37d8d4756b569c23bf6812d99

  • 访问服务器部署的网站 http://42.51.0.196:8080/forum-java/

因为我们打的war包名是forum-java.war,所以访问的路径是forum-java

477768031e7b47ab829df9e363988a1d

  • 修改打包后的war名称

372a9ae95d5b48bdb01e2fa38bf9f9d9

到这里虽然能够访问到我们部署的服务了,但是还不可以登录,因为我们项目中所有的请求路径都是根路径,并没有 /forum-java 前缀,所以需要在服务器部署个nginx做下转发。

3.5 安装nginx

因为nginx是c写的,所以我们需要安装c的编译环境,然后把包下载下来,自己编译一下,然后在启动就好了。

  • 安装 nginx 需要先将官网下载的源码进行编译,编译依赖 gcc 环境,如果没有 gcc 环境,则需要安装:
yum install gcc-c++

0b95f28d93f9407e81dc179d2fba0cca

4ce7d64183bc4f168110574334ae4894

  • PCRE pcre-devel 安装
yum install -y pcre pcre-devel
  • zlib 安装
yum install -y zlib zlib-devel
  • OpenSSL 安装
yum install -y openssl openssl-devel
  • 安装gcc
yum -y install gcc
  • 使用wget命令下载(推荐)。确保系统已经安装了wget,如果没有安装,执行 yum install wget 安装。
wget -c https://nginx.org/download/nginx-1.12.0.tar.gz
  • 解压
tar -zxvf nginx-1.12.0.tar.gz cd nginx-1.12.0
  • 配置
./configure
  • 编译安装
make make install
  • 查找安装路径
whereis nginx
  • 启动 nginx
cd /usr/local/nginx/sbin/ ./nginx
  • 修改配置
/usr/local/nginx/conf vi nginx.conf

nginx 默认监听的是80端口,所以我们只需要将访问 /路径转发到本地的 8080/forum-java/ 就好了,如下图:

location / { # root html; # index index.html index.htm; proxy_set_header X-Real-IP $remote_addr; proxy_pass http://127.0.0.1:8080/forum-java/; index index.html index.htm; proxy_connect_timeout 300; #单位秒 proxy_send_timeout 300; #单位秒 proxy_read_timeout 300; #单位秒 }

dc5455da9aa946cf9ee036237e1f20f1

  • 使路由配置生效
/usr/local/nginx/sbin ./nginx -s reload
  • 访问服务器 ip,不加端口时默认是 80 端口;

fdf20b718aeb46e89a0c4cb602dd962c

  • 管理员登录

2f47cc92f6b04ca49fa27f14b164147c

登录成功

544cb1fd130c4ab3a34bb99c0a3c17d9

  • 访问管理后台

d0436687a7c44898ad57a1ce0a0451be

我们已经可以通过 IP 访问部署的服务了,并且也验证了功能都是没问题的。但是IP的访问方式不是很友好。

3.6 配置域名解析

  • 域名提供商配置域名的dns解析配置

这里就没啥好说的了,域名解析配置在域名提供商那边都有对应的控制台,把域名解析到服务器的ip就好了,一般解析后不会立即生效,等待一会也就差不多了。这里可以去对应域名提供商那边看对应教程。

  • 在nginx上配置对应的域名解析

将nginx的配置server_name改为域名就好了。

server { listen 80; server_name 这里填你的域名; ...... }

a16814c757e84f94834a3ccae809b81d

四 常见问题

4.1 修改服务端口

需要修改下面几个地方

  • 修改服务启动端口

7886c0a3bac145da9a93bf94d6ce94e4

  • 修改编辑器页面访问接口的端口

0448b3ea3991418dbf897d7c77e7cb7f

  • 修改管理后台页面访问接口的端口

40fe54b0981b48e0954a425573c05d93

最后一次编辑于 2023年12月29日 5

5

回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试

2025-04-08 17:23:42      回复

5

回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试

2025-04-08 17:23:52 回复

5 回复:5

回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试回复内容字数测试

2025-04-08 17:24:01 回复

666

9999

2025-04-08 10:51:19      回复

666

6565

2025-04-08 10:51:34 回复

tianyue

12313123123

2024-09-19 16:33:13      回复

123

<script>alert(1)</script>

2024-09-04 22:39:39      回复

123

alert("1")

2024-09-04 22:38:37      回复

zcr

cs

2024-08-26 16:48:35      回复

gggtttt

test

2024-08-12 23:38:19      回复

gggtttt

test

2024-08-12 23:36:59      回复

bugaosuni

asdfadf

2024-05-31 00:07:16      回复

bugaosuni

adadfadfasdf

2024-05-31 00:07:29 回复

bugaosuni 回复:bugaosuni

adafdfadf

2024-05-31 00:07:36 回复

yehui39

111

2024-08-01 00:43:41 回复

小凯 回复:bugaosuni

此时

2024-09-10 01:27:38 回复

qiyang

debug启动项目,显示”java: 程序包com.sun.net.ssl.internal.ssl不存在“,请问如何解决?

2024-04-07 01:05:00      回复

lhx

同问

2025-01-14 21:56:25 回复

wang

wada

2024-03-14 18:15:13      回复

Rip

wada

2024-04-02 00:46:35 回复

推荐阅读
  开发者客栈   2023年12月29日   3612   5   20 社区开源
  Alan   2024年01月22日   582   3   7 社区
  xuge520   2025年02月25日   60   0   0 开源