我干了两个月的大项目,开源了!

打印 上一主题 下一主题

主题 872|帖子 872|积分 2616

大家好,我是程序员鱼皮。我肝了 2 个多月的大项目《智能协同云图库》,终于完结了!

为了让更多同学到场学习,我特么直接把全部代码 完整开源
开源仓库:https://github.com/liyupi/yu-picture

光分享源码还不够,我还录制了一套将源码快速上线的视频教程:https://bilibili.com/video/BV1akwGeSERK ,有关这个项目的先容、前后端摆设方法、项目功能演示,都在这个视频里了~
不外虽然代码是开源的,项目的视频教程 + 文字教程 + 简历写法 + 面试题解是仅供 编程导航 的鱼友学习的,毕竟我连续肝了 2 个月嘛。

下面分享将智能协同云图库项目上线的文字教程,推荐配合前面的视频教程食用。
 
 
本节重点内容是项目摆设上线,可以独立学习,希望大家能够掌握这种快速上线项目的方法。
包括:

  • 服务器初始化
  • 摆设规划
  • 安装依赖
  • 后端摆设
  • 前端摆设
  • 测试验证
  • 扩展知识
 
一、服务器初始化

首先购买一台服务器,各大云服务商的新用户都比较便宜,建议先看 云产物 页面。
推荐选择轻量应用服务器,提供了很多开箱即用的模板,帮我们预装了环境和软件,省时省力。
鱼皮这里选择一台预装了宝塔 Linux 应用的轻量应用服务器,设置为 2 核 2 G,摆设咱们的项目充足了。应用模板一般选择最新版本就好了,如下图:

宝塔 Linux 是一个可视化 Linux 运维管理工具,提供了很多帮助我们管理服务器的功能,适合中小团队或者个人学习利用。
购买好服务器后,进入控制台,可以看到新增的服务器信息,注意不要主动对外袒露公网 IP!

 
点击服务器进入详情页,在防火墙标签页中放通 8888 宝塔面板端口,否则无法在自己的电脑上访问宝塔。

新版本的轻量应用服务器已经自动为我们放通该端口。否则需要手动新增一条防火墙规则:

进入应用管理标签页,登录宝塔。
首次登录时,需要先登录服务器,通过输入命令的方式获取宝塔默认账号暗码,如图:

点击登录后,进入到 web 终端,复制脚本并执行:

根据终端输出的信息,访问宝塔面板,输入初始用户名和暗码:

首次进入宝塔时,会提示我们安装环境,这里推荐安装 LNMP(包含 Nginx 服务器),适合摆设前后端分离的项目:

首次进入宝塔面板时,记得修改面板账号暗码(每次修改完都要重新登录):

 
二、摆设规划

在正式操作前后端摆设前,我们要先进行一个规划,比如要摆设哪些项目和服务、需要哪些依赖、占用哪些端口等。
1、获取源码

本项目代码开源:https://github.com/liyupi/yu-picture
建议新手学习和摆设 yu-picture-backend 目录,利用传统的分层架构:https://github.com/liyupi/yu-picture/tree/master/yu-picture-backend
有一定经验的同学可以学习摆设 yu-picture-backend-ddd 目录,利用 DDD 领域驱动筹划:https://github.com/liyupi/yu-picture/tree/master/yu-picture-backend-ddd
但这两种架构的摆设方式是一致的~
 
2、摆设方案

为了提高效率,本项现在端和后端均利用宝塔面板进行摆设,可以很方便地管理服务器。
涉及到具体的摆设方式,前端要遵照 Vue 项目的摆设模式,基于 Nginx 运行;后端可以直接利用宝塔的 Java 项目管理器运行 jar 包。
在鱼皮编程导航的 代码生成器共享平台项目 中,解说过宝塔 + Nginx + 后端 Java 项目管理器(jar 包)的摆设方式。在鱼皮编程导航的 AI 答题应用平台项目 中,解说过 Vercel + Docker + 云托管平台的摆设方式,感兴趣的同学可以学习。基本上学会这几种摆设方式,能够应对绝大多数摆设需求了。
 
3、地址规划

前端:通过 Nginx 进行转发,访问地址为 http://{域名}。
后端:通过 Nginx 进行转发,访问地址为 http://{域名}/api。实际运行在 8123 端口。JDK 建议选择 17 版本!
为什么要用 Nginx 转发?
前端和后端域名一致,保证不会出现跨域题目。
Nginx:服务器 80 端口,默认已安装。
数据库:服务器 3306 端口,默认已安装。
Redis:服务器 6379 端口,需要手动安装。
 
4、注意事项

做好规划后,我们需要在腾讯云控制台的防火墙中开通需要外网访问的服务端口,比如 MySQL 和 Redis:

 
三、安装依赖

1、数据库

宝塔面板已经自动安装 MySQL 数据库,我们可以直接利用。
先为后端项目添加一个数据库。数据库名称和我们项目需要的数据库名称保持一致(此处为 mianshiya),注意用户名、暗码和访问权限:

在 IDEA 中打开后端项目,通过数据库面板在本地检查连接是否正常:

执行脚本,初始化库表:

记得验证数据库表是否创建成功,如下图:

 
2、Redis

在宝塔面板的软件商店中,搜索并安装 Redis:

版本选择默认的即可:

安装完成后,需要设置 Redis,开启远程访问并设置暗码,否则我们自己的电脑是无法连接 Redis 的:

修改设置后,一定要重载设置才能生效:

最后,在 IDEA 数据库面板中验证本地可否连接远程 Redis:

 
3、Java 环境

要摆设 Java 项目,必须安装 JDK。在宝塔面板中,可以通过下图的方式快速安装指定版本的 JDK。此处我们先安装 JDK 17:

建议多安装几个版本,比如 JDK 8、11、17,需要用哪个版本的时候可以随时切换。
 
4、其他服务

比如 腾讯云 COS 对象存储阿里云百炼 AI,可以去对应的官网开通。
假如不会开通的话,可以通过第 4 章教程开通 COS 对象存储,第 9 章教程开通阿里云百炼 AI。
注意,要给对象存储增加该服务器 IP(或者实际访问前端域名)的跨域设置,否则编辑图片时将无法正确加载图片。

 
 
接下来,我们分别进行后端和前端摆设。
 
四、后端摆设

1、修改设置

修改 application-prod 生产环境设置,包括数据库、Redis、对象存储、阿里云百炼 AI 的 key 等,替换为上述安装依赖时指定的设置(如用户名、暗码)。
注意为了性能,还要关闭 MyBatis Plus 的日志;为了安全,要给 Knife4j 接口文档设置用户名和暗码。
参考设置如下:
  1. # 线上配置文件<br># @author <a target="_blank" href="https://github.com/liyupi">程序员鱼皮</a><br># @from <a target="_blank" href="https://codefather.cn">编程导航</a><br>server:<br>port: 8123<br>spring:<br> # 数据库配置<br> # todo 需替换配置<br>datasource:<br>  driver-class-name: com.mysql.cj.jdbc.Driver<br>  url: jdbc:mysql://81.69.229.63:3306/yu_picture<br>  username: yu_picture_root<br>  password: yu_picture_123456<br> # Redis 配置<br> # todo 需替换配置<br>redis:<br>  database: 0<br>  host: 81.69.229.63<br>  port: 6379<br>  timeout: 5000<br>  password: 123456<br>mybatis-plus:<br>configuration:<br>   # 生产环境关闭日志<br>  log-impl: ''<br># 接口文档配置<br>knife4j:<br>basic:<br>  enable: true<br>  username: root<br>  password: 123456<br># 对象存储配置<br>cos:<br>client:<br>  host: xxx<br>  secretId: xxx<br>  secretKey: xxx<br>  region: xxx<br>  bucket: xxx<br># 阿里云 AI 配置<br>aliYunAi:<br>apiKey: xxx
复制代码
 
2、打包摆设

首先更改 pom.xml 文件的打包设置,删除掉主类设置的 skip 设置,才能打包:
  1. <build><br>   <plugins><br>       <plugin><br>           <groupId>org.springframework.boot</groupId><br>           <artifactId>spring-boot-maven-plugin</artifactId><br>           <version>${spring-boot.version}</version><br>           <configuration><br>               <mainClass>com.yupi.yupicturebackend.YuPictureBackendApplication</mainClass><br>               <skip>true</skip><br>           </configuration><br>       </plugin><br>   </plugins><br></build>
复制代码
在 IDEA 中打开后端项目,忽略测试并打包:

打包成功,得到 jar 包文件:

上传 jar 包到服务器,此处为了方便,就放到 web 根目录:

然后添加 Java 项目,在项目执行命令中,必须指定生产环境的设置!还可以根据需要调整内存:

启动成功后,能够看到状态和端口占用如图:

假如发现启动失败,需要先观察日志,下图仅为一个示例:

 
但是,我们现在无法通过浏览器访问接口文档:http://81.69.229.63:8123/api/doc.html

这是由于我们的服务器防火墙没有放开 8123 端口。这里我们故意不放开,由于在之前的摆设规划中,后端需要通过 Nginx 进行转发,从而解决跨域题目。
 
3、Nginx 转发

新建一个 Nginx 站点,域名填写当前服务器 IP 或者自己的域名,根目录随意填写即可(只要不包含中文):

假如访问的是后端接口(地址有 /api 前缀),则 Nginx 将哀求转发到后端服务,对应设置代码如下:
  1. location /api {<br> proxy_pass  http://127.0.0.1:8123;<br> proxy_set_header Host $proxy_host;<br> proxy_set_header X-Real-IP $remote_addr;<br> proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;<br> proxy_buffering off;<br> proxy_set_header Connection "";<br>}
复制代码
但是,对于本项目,光有 HTTP 转发设置还不够!后端还需要提供 WebSocket 连接,所以也要对 WebSocket 进行转发,再给 Nginx 补充下列设置:
  1. # 代理 WebSocket 连接 (专门用于 WebSocket 请求)<br>location /api/ws {<br> proxy_pass http://127.0.0.1:8123;<br> proxy_http_version 1.1;<br> proxy_set_header Upgrade $http_upgrade;<br> proxy_set_header Connection "upgrade";<br> proxy_set_header Host $host;<br> proxy_set_header X-Real-IP $remote_addr;<br> proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;<br> proxy_buffering off;<br> proxy_read_timeout 86400s;<br>}
复制代码
修改 Nginx 设置如图:

修改完后,就可以通过 80 端口(可以省略)访问到接口了。
一定要解释掉下列设置!否则访问接口文档时,静态资源的加载大概会出错。由于浏览器会从本地缓存加载资源,而不是动态哀求资源。

 
五、前端摆设

前端摆设可以参考 Vite 官方文档:https://cn.vitejs.dev/guide/static-deploy.html
分为修改设置、打包摆设和 Nginx 转发这 3 个步骤。
1、修改设置

线上的前端需要哀求线上的后端接口,所以需要修改 request.ts 文件中的哀求地址为线上:
  1. // 区分开发和生产环境<br>const DEV_BASE_URL = "http://localhost:8123";<br>const PROD_BASE_URL = "http://81.69.229.63";<br>// 创建 Axios 实例<br>const myAxios = axios.create({<br> baseURL: PROD_BASE_URL,<br> timeout: 10000,<br> withCredentials: true,<br>});
复制代码
此外,由于本项目用到了 WebSocket,还要同步修改 pictureEditWebSocket.ts 文件中的 WebSocket 的连接地址:
  1. const DEV_BASE_URL = "ws://localhost:8123";<br>const PROD_BASE_URL = "ws://81.69.229.63";<br>const url = `${PROD_BASE_URL}/api/ws/picture/edit?pictureId=${this.pictureId}`
复制代码
 
2、打包摆设

1)参考 Vite 官网,在 package.json 文件中定义 pure-build 命令:
  1. {<br> "scripts": {<br>   "dev": "vite",<br>   "pure-build": "vite build",<br>   "build": "run-p type-check "build-only {@}" --",<br>}<br>}
复制代码
为什么明明已经有 build 命令了,我们还要自己定义 pure-build 命令呢?
由于脚手架内置的 build 命令会执行类型检查,假如项目代码中有任何类型不规范的地方,都会导致打包失败!

虽然可以自己一个个修复类型,但是太影响效率了,得不偿失,所以引入一个更干净的构建命令。
2)执行 pure-build 命令,执行打包构建。
注意,假如 Node.js 版本较低,会构建失败,这时可以到 官网 安装更新的版本,比如 v20.17.0 等长期支持版本。
构建成功后,可以得到用于摆设的静态文件 dist 目录:

把 dist 目录下的全部文件上传到服务器上(可以新建一个 yu-picture-frontend 目录)。文件较多时,建议先在本地压缩,上传压缩包到服务器后再解压。如图:

 
3、Nginx 转发

一般来说,用户无法直接访问服务器上的文件,需要利用 Nginx 提供静态文件的访问本领。
修改已有站点的网站目录设置,指向前端文件根目录:

然后访问服务器地址(或者自己设置的域名),就能打开前端网站了:

但是经过验证,现在访问除了主页外的其他页面(比如 /add_picture),假如刷新页面,就会出现 404 错误。

这个题目是由于 Vue 是单页面应用(前端路由),打包后的文件只有 index.html,服务器上不存在对应的页面文件(比如 /add_picture.html),所以需要在 Nginx 设置转发。假如找不到某个页面文件,就加载主页 index.html 文件。
修改 Nginx 设置,补充下列代码:
  1. location / {<br> try_files $uri $uri/index.html /index.html;<br>}
复制代码
如图:

保存设置后,再次刷新页面,可以正常访问。
 
六、测试验证

最后,我们来对上线效果进行验证。
1)用户注册登录

然后通过修改数据库的方式,将该用户的角色设置为管理员,从而利用更多功能。
2)进入图片管理 => 批量创建图片页面,抓取一批图片作为网站的初始数据

3)进入主页,查看到了公共图库

4)创建一个私有空间

5)通过文件上传和 URL 上传给私有空间上传一些图片:

6)查看私有空间的图片,实验各种搜索功能(比如按颜色搜索):

7)利用 AI 扩图功能来编辑图片(基于 阿里云百炼 AI 实现)

8)创建团队空间

9)给团队添加一位成员,设置角色为 “编辑者”

10)给团队空间上传一张图片,然后让 2 名成员同时进入编辑:

假如编辑时,图片无法正常加载,大概是由于对象存储没有设置跨域,补充设置即可。
 
七、扩展知识

再分享一种更快摆设后端的方法,可以利用 Docker + Docker Compose 快速摆设后端依赖和后端项目本身。
可以把 Docker 容器技术理解为安装操作系统时的镜像、或者安装 APP 时的安装包,只要定义好 Docker 设置文件,就能快速基于设置启动服务或项目。
而 Docker Compose 可以组合编排多个 Docker 容器,按照次序快速启动多个服务或项目。
给大家提供一个示例的 Docker Compose 设置文件,定义了 MySQL、Redis 和 Spring Boot 项目的启动,大家可以基于这个文件进行定制修改:
  1. # Docker Compose 文件,用于 Spring Boot 项目,依赖 MySQL 和 Redis<br>​<br>version: '3.8'<br>​<br>services:<br>​<br> # MySQL 数据库服务<br>mysql:<br>  image: mysql:8.0<br>  container_name: mysql_db<br>  restart: always<br>  environment:<br>    MYSQL_ROOT_PASSWORD: root           # 设置 MySQL root 用户的密码<br>    MYSQL_DATABASE: yu_picture          # 更新为 yu_picture 数据库<br>    MYSQL_USER: root                    # 更新为 root 用户<br>    MYSQL_PASSWORD: 123456              # 更新为 123456 密码<br>    TZ: Asia/Shanghai                    # 设置时区为东八区<br>  ports:<br>    - "3306:3306"                       # 映射 MySQL 端口到主机<br>  volumes:<br>    - mysql_data:/var/lib/mysql         # 数据持久化到宿主机(使用 Docker 管理的命名卷)<br>  command: --default-authentication-plugin=mysql_native_password<br>​<br> # Redis 缓存服务<br>redis:<br>  image: redis:5.0<br>  container_name: redis_cache<br>  restart: always<br>  ports:<br>    - "6379:6379"                      # 映射 Redis 端口到主机<br>  volumes:<br>    - redis_data:/data                  # 数据持久化到宿主机(使用 Docker 管理的命名卷)<br>  environment:<br>    TZ: Asia/Shanghai                    # 设置时区为东八区<br>​<br> # Spring Boot 应用服务<br>springboot_app:<br>  image: openjdk:11-jre-slim<br>  container_name: springboot_app<br>  working_dir: /app<br>  volumes:<br>    - .:/app                            # 挂载本地目录到容器中<br>  ports:<br>    - "8123:8123"                      # 映射 Spring Boot 端口到主机<br>  environment:<br>    TZ: Asia/Shanghai                   # 设置时区为东八区<br>  command: [ "java", "-jar", "target/yu-picture-backend-0.0.1-SNAPSHOT.jar", "--spring.profiles.active=prod" ]  # 使用 prod 配置文件启动 Spring Boot 应用<br>  depends_on:<br>    - mysql<br>    - redis<br>​<br># 使用 Docker 管理的命名卷<br>volumes:<br>mysql_data:<br>redis_data:
复制代码
有了设置文件后,就可以利用宝塔面板自带的 Docker 本领,去进行项目的摆设了,感兴趣的同学可以实验一下:

在鱼皮编程导航的 OJ 在线判题项目教程 中,解说过基于 Docker + Docker Compose 快速摆设微服务项目的方法,视频地址:https://www.bilibili.com/video/BV1Cp4y1F7eA
 
最后

至此,整个项目已经完成上线,希望大家能通过这个项目掌握企业级项目的开辟、优化和上线方法,得到全方面编程技能和程序员素养的提升。
更多编程学习资源


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

水军大提督

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表