5. 文件服務開發 全套代碼及資料全部完整提供,點此處下載 5.1 環境搭建 5.1.1 資料庫環境搭建 第一步:創建pd_files資料庫 create database pd_files character set utf8mb4; 第二步:在pd_files資料庫中創建pd_attachmen ...
目錄
5. 文件服務開發
5.1 環境搭建
5.1.1 資料庫環境搭建
第一步:創建pd_files資料庫
create database pd_files character set utf8mb4;
第二步:在pd_files資料庫中創建pd_attachment和pd_file數據表
CREATE TABLE `pd_attachment` (
`id` bigint(20) NOT NULL COMMENT 'ID',
`biz_id` varchar(64) DEFAULT NULL COMMENT '業務ID',
`biz_type` varchar(255) DEFAULT NULL COMMENT '業務類型\n#AttachmentType',
`data_type` varchar(255) DEFAULT 'IMAGE' COMMENT '數據類型\n#DataType{DIR:目錄;IMAGE:圖片;VIDEO:視頻;AUDIO:音頻;DOC:文檔;OTHER:其他}',
`submitted_file_name` varchar(255) DEFAULT '' COMMENT '原始文件名',
`group_` varchar(255) DEFAULT '' COMMENT 'FastDFS返回的組\n用於FastDFS',
`path` varchar(255) DEFAULT '' COMMENT 'FastDFS的遠程文件名\n用於FastDFS',
`relative_path` varchar(255) DEFAULT '' COMMENT '文件相對路徑',
`url` varchar(255) DEFAULT '' COMMENT '文件訪問鏈接\n需要通過nginx配置路由,才能訪問',
`file_md5` varchar(255) DEFAULT NULL COMMENT '文件md5值',
`context_type` varchar(255) DEFAULT '' COMMENT '文件上傳類型\n取上傳文件的值',
`filename` varchar(255) DEFAULT '' COMMENT '唯一文件名',
`ext` varchar(64) DEFAULT '' COMMENT '尾碼\n (沒有.)',
`size` bigint(20) DEFAULT '0' COMMENT '大小',
`org_id` bigint(20) DEFAULT NULL COMMENT '組織ID\n#c_core_org',
`icon` varchar(64) DEFAULT '' COMMENT '圖標',
`create_month` varchar(10) DEFAULT NULL COMMENT '創建年月\n格式:yyyy-MM 用於統計',
`create_week` varchar(10) DEFAULT NULL COMMENT '創建時處於當年的第幾周\nyyyy-ww 用於統計',
`create_day` varchar(12) DEFAULT NULL COMMENT '創建年月日\n格式: yyyy-MM-dd 用於統計',
`create_time` datetime DEFAULT NULL COMMENT '創建時間',
`create_user` bigint(11) DEFAULT NULL COMMENT '創建人',
`update_time` datetime DEFAULT NULL COMMENT '最後修改時間',
`update_user` bigint(11) DEFAULT NULL COMMENT '最後修改人',
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=COMPACT COMMENT='附件';
CREATE TABLE `pd_file` (
`id` bigint(20) NOT NULL COMMENT '主鍵',
`data_type` varchar(255) DEFAULT 'IMAGE' COMMENT '數據類型\n#DataType{DIR:目錄;IMAGE:圖片;VIDEO:視頻;AUDIO:音頻;DOC:文檔;OTHER:其他}',
`submitted_file_name` varchar(255) DEFAULT '' COMMENT '原始文件名',
`tree_path` varchar(255) DEFAULT ',' COMMENT '父目錄層級關係',
`grade` int(11) DEFAULT '1' COMMENT '層級等級\n從1開始計算',
`is_delete` bit(1) DEFAULT b'0' COMMENT '是否刪除\n#BooleanStatus{TRUE:1,已刪除;FALSE:0,未刪除}',
`folder_id` bigint(20) DEFAULT '0' COMMENT '父文件夾ID',
`url` varchar(1000) DEFAULT '' COMMENT '文件訪問鏈接\n需要通過nginx配置路由,才能訪問',
`size` bigint(20) DEFAULT '0' COMMENT '文件大小\n單位位元組',
`folder_name` varchar(255) DEFAULT '' COMMENT '父文件夾名稱',
`group_` varchar(255) DEFAULT '' COMMENT 'FastDFS組\n用於FastDFS',
`path` varchar(255) DEFAULT '' COMMENT 'FastDFS遠程文件名\n用於FastDFS',
`relative_path` varchar(255) DEFAULT '' COMMENT '文件的相對路徑 ',
`file_md5` varchar(255) DEFAULT '' COMMENT 'md5值',
`context_type` varchar(255) DEFAULT '' COMMENT '文件類型\n取上傳文件的值',
`filename` varchar(255) DEFAULT '' COMMENT '唯一文件名',
`ext` varchar(64) DEFAULT '' COMMENT '文件名尾碼 \n(沒有.)',
`icon` varchar(64) DEFAULT '' COMMENT '文件圖標\n用於雲盤顯示',
`create_month` varchar(10) DEFAULT NULL COMMENT '創建時年月\n格式:yyyy-MM 用於統計',
`create_week` varchar(10) DEFAULT NULL COMMENT '創建時年周\nyyyy-ww 用於統計',
`create_day` varchar(12) DEFAULT NULL COMMENT '創建時年月日\n格式: yyyy-MM-dd 用於統計',
`create_time` datetime DEFAULT NULL COMMENT '創建時間',
`create_user` bigint(20) DEFAULT NULL COMMENT '創建人',
`update_time` datetime DEFAULT NULL COMMENT '最後修改時間',
`update_user` bigint(20) DEFAULT NULL COMMENT '最後修改人',
`source` varchar(10) DEFAULT 'inner' COMMENT '文件來源:inner, outer',
PRIMARY KEY (`id`) USING BTREE,
FULLTEXT KEY `FU_TREE_PATH` (`tree_path`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=COMPACT COMMENT='文件表';
註:SQL腳本位置為 文件服務/資料/資料庫/pd_files.sql
前面已經提到,本系統的文件服務提供兩種類型的服務:
1、面對應用系統的通用附件服務
提供統一的上傳介面,屏蔽底層的存儲方案(本地存儲、FastDFS、阿裡雲存儲、七牛雲存儲等),可獨立運行服務。上傳的文件相關信息保存在pd_attachment表中。
2、面對用戶的網盤服務
提供統一的上傳介面,屏蔽底層的存儲方案,有文件夾和文件的概念,支持大文件分片上傳、斷點續傳。上傳的文件相關信息保存在pd_file表中。
pd_attachment表為附件表,具體表結構如下:
pd_file表為文件/文件夾信息表,具體表結構如下:
5.1.2 Nacos環境搭建
第一步:安裝Nacos併進行配置(略)
第二步:在Nacos中創建命名空間fileService(名字隨便起,只要和程式里配置的一樣就可以)
第三步:在Nacos中將配置文件導入到file-server命名空間
註:yml配置文件位置為 文件服務/資料/Nacos/nacos_config_export_2020-04-30 11_47_56.zip
5.1.3 Nginx環境搭建
當文件存儲策略為本地存儲或者FastDFS存儲時,需要使用Nginx服務來對外提供文件的下載和查看等功能。
第一步:安裝Nginx(略)
第二步:配置Nginx_HOME/conf/nginx.conf
註:可參照 文件服務/資料/Nginx/nginx.conf
進行配置
5.1.4 maven工程環境搭建
說明:本項目的開發並不是從零開始搭建開發環境,而是在一個名為品達通用許可權系統的基礎上進行文件服務的開發。品達通用許可權系統是傳智播客提供的一個開發平臺(腳手架),其中提供了一系列的基礎組件並且已經實現了許可權管理、認證、鑒權、JWT解析等功能。用戶可以在此平臺基礎上開發自己的業務功能。
品達通用許可權系統位置: 文件服務/資料/初始工程(腳手架)/pinda-authority
具體搭建過程:
第一步:導入品達通用許可權系統到IDEA並修改pd-apps模塊中的pom.xml文件
<!-- 開發環境 -->
<profile>
<id>dev</id>
<activation>
<!--預設激活配置-->
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<!--當前環境-->
<pom.profile.name>dev</pom.profile.name>
<!--Nacos配置中心地址-->
<pom.nacos.ip>127.0.0.1</pom.nacos.ip>
<pom.nacos.port>8848</pom.nacos.port>
<!--Nacos配置中心命名空間ID-->
<pom.nacos.namespace>
53c655b3-babd-4402-82f1-33b7e4c90111
</pom.nacos.namespace>
</properties>
</profile>
第二步:在品達通用許可權系統平臺基礎之上創建文件服務對應的maven工程pd-file
第三步:在pd-file下創建pd-file-entity子模塊並配置pom.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>pd-file</artifactId>
<groupId>com.itheima</groupId>
<version>1.0.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>pd-file-entity</artifactId>
<description>文件服務實體模塊</description>
<dependencies>
<dependency>
<groupId>com.itheima</groupId>
<artifactId>pd-tools-common</artifactId>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-core</artifactId>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus</artifactId>
</dependency>
</dependencies>
</project>
第四步:將文件服務相關的實體類、DTO、domain等導入pd-file-entity中
註:文件服務相關實體類位置 文件服務/資料/文件服務相關實體類
第五步:在pd-file下創建pd-file-server子模塊並配置pom.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>pd-file</artifactId>
<groupId>com.itheima</groupId>
<version>1.0.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>pd-file-server</artifactId>
<description>文件服務啟動模塊</description>
<dependencies>
<dependency>
<groupId>com.itheima</groupId>
<artifactId>pd-auth-api</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<exclusions>
<exclusion>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.itheima</groupId>
<artifactId>pd-tools-log</artifactId>
</dependency>
<dependency>
<groupId>com.itheima</groupId>
<artifactId>pd-tools-swagger2</artifactId>
</dependency>
<dependency>
<groupId>com.itheima</groupId>
<artifactId>pd-tools-validator</artifactId>
</dependency>
<dependency>
<groupId>com.itheima</groupId>
<artifactId>pd-tools-xss</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<exclusions>
<exclusion>
<artifactId>fastjson</artifactId>
<groupId>com.alibaba</groupId>
</exclusion>
<exclusion>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
<exclusions>
<exclusion>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.ow2.asm</groupId>
<artifactId>asm</artifactId>
<version>${asm.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-websocket</artifactId>
</exclusion>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-undertow</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-json</artifactId>
</dependency>
<!-- 測試 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.itheima</groupId>
<artifactId>pd-file-entity</artifactId>
<version>1.0.0</version>
</dependency>
<dependency>
<groupId>com.itheima</groupId>
<artifactId>pd-tools-databases</artifactId>
</dependency>
<dependency>
<groupId>com.itheima</groupId>
<artifactId>pd-tools-dozer</artifactId>
</dependency>
<!-- @RefreshScope 需要使用 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-context</artifactId>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
</dependency>
<!-- 阿裡雲oss -->
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
</dependency>
<!-- 七牛oss -->
<dependency>
<groupId>com.qiniu</groupId>
<artifactId>qiniu-java-sdk</artifactId>
</dependency>
<!-- FastDFS -->
<dependency>
<groupId>com.github.tobato</groupId>
<artifactId>fastdfs-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
<scope>compile</scope>
</dependency>
</dependencies>
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
第六步:導入配置文件到pd-file-server中
註:文件服務相關配置文件位置: 文件服務/資料/文件服務相關配置文件
第七步:在pd-file-server中創建啟動類
package com.itheima.pinda;
import com.itheima.pinda.validator.config.EnableFormValidator;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.netflix.hystrix.EnableHystrix;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.core.env.Environment;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import java.net.InetAddress;
import java.net.UnknownHostException;
@SpringBootApplication
@EnableDiscoveryClient
@EnableHystrix
@EnableFeignClients(value = {
"com.itheima.pinda",
})
@EnableTransactionManagement
@Slf4j
@EnableFormValidator
public class FileServerApplication {
public static void main(String[] args) throws UnknownHostException {
ConfigurableApplicationContext application = SpringApplication.run(FileServerApplication.class, args);
Environment env = application.getEnvironment();
log.info("\n----------------------------------------------------------\n\t" +
"應用 '{}' 運行成功! 訪問連接:\n\t" +
"Swagger文檔: \t\thttp://{}:{}/doc.html\n\t" +
"資料庫監控: \t\thttp://{}:{}/druid\n" +
"----------------------------------------------------------",
env.getProperty("spring.application.name"),
InetAddress.getLocalHost().getHostAddress(),
env.getProperty("server.port"),
"127.0.0.1",
env.getProperty("server.port"));
}
}
第八步:將配置類導入pd-file-server中
註:文件服務相關配置類位置: 文件服務/資料/文件服務配置類
第九步:在pd-file-server中導入工具類
註:文件服務相關工具類位置: 文件服務/資料/文件服務工具類
第十步:在pd-file-server中導入配置屬性類
註:文件服務相關配置屬性類位置: 文件服務/資料/文件服務配置屬性類
第十一步:在pd-file-server中導入Mapper介面
註:文件服務相關Mapper介面位置: 文件服務/資料/文件服務相關Mapper介面