@pencilps/avatar-boot-cli 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +309 -0
- package/bin/cli.js +3 -0
- package/package.json +34 -0
- package/src/index.js +78 -0
- package/src/prompts.js +78 -0
- package/src/template.js +37 -0
- package/src/transform.js +172 -0
- package/src/utils.js +34 -0
- package/templates/.claude/rules/architecture-redlines.md +146 -0
- package/templates/.claude/rules/code-review-standards.md +137 -0
- package/templates/.claude/rules/coding-standards.md +56 -0
- package/templates/.claude/rules/git-commit.md +59 -0
- package/templates/.claude/rules/layered-architecture.md +201 -0
- package/templates/.claude/rules/mybatis-plus.md +263 -0
- package/templates/.claude/rules/tech-stack.md +41 -0
- package/templates/.claude/rules/version.md +467 -0
- package/templates/.claude/skills/ai-tool-guide/SKILL.md +314 -0
- package/templates/.claude/skills/api-design/SKILL.md +200 -0
- package/templates/.claude/skills/api-doc-generator/SKILL.md +380 -0
- package/templates/.claude/skills/api-service-module-creator/SKILL.md +1114 -0
- package/templates/.claude/skills/avatar-boot-starter-feign/README.md +243 -0
- package/templates/.claude/skills/avatar-boot-starter-feign/SKILL.md +71 -0
- package/templates/.claude/skills/avatar-boot-starter-feign/references//345/212/237/350/203/275/350/257/246/350/247/243.md +65 -0
- package/templates/.claude/skills/avatar-boot-starter-feign/references//345/277/253/351/200/237/346/216/245/345/205/245/346/214/207/345/215/227.md +75 -0
- package/templates/.claude/skills/avatar-boot-starter-feign/references//351/205/215/347/275/256/345/217/202/350/200/203.md +70 -0
- package/templates/.claude/skills/avatar-boot-starter-job/README.md +437 -0
- package/templates/.claude/skills/avatar-boot-starter-job/SKILL.md +58 -0
- package/templates/.claude/skills/avatar-boot-starter-job/references//345/270/270/350/247/201/351/227/256/351/242/230.md +55 -0
- package/templates/.claude/skills/avatar-boot-starter-job/references//345/277/253/351/200/237/346/216/245/345/205/245/344/270/216/351/205/215/347/275/256.md +124 -0
- package/templates/.claude/skills/avatar-boot-starter-job/references//347/233/221/346/216/247/346/214/207/346/240/207.md +72 -0
- package/templates/.claude/skills/avatar-boot-starter-kafka/README.md +580 -0
- package/templates/.claude/skills/avatar-boot-starter-kafka/SKILL.md +56 -0
- package/templates/.claude/skills/avatar-boot-starter-kafka/references//346/234/200/344/275/263/345/256/236/350/267/265.md +43 -0
- package/templates/.claude/skills/avatar-boot-starter-kafka/references//346/240/270/345/277/203/345/212/237/350/203/275.md +117 -0
- package/templates/.claude/skills/avatar-boot-starter-kafka/references//351/205/215/347/275/256/345/217/202/350/200/203.md +54 -0
- package/templates/.claude/skills/avatar-boot-starter-mysql/README.md +572 -0
- package/templates/.claude/skills/avatar-boot-starter-mysql/SKILL.md +62 -0
- package/templates/.claude/skills/avatar-boot-starter-mysql/references//345/256/236/344/275/223/344/270/216/345/212/237/350/203/275.md +96 -0
- package/templates/.claude/skills/avatar-boot-starter-mysql/references//345/277/253/351/200/237/346/216/245/345/205/245/344/270/216/346/225/260/346/215/256/346/272/220.md +91 -0
- package/templates/.claude/skills/avatar-boot-starter-mysql/references//351/253/230/347/272/247/347/211/271/346/200/247/344/270/216/351/205/215/347/275/256.md +59 -0
- package/templates/.claude/skills/avatar-boot-starter-nacos/README.md +901 -0
- package/templates/.claude/skills/avatar-boot-starter-nacos/SKILL.md +62 -0
- package/templates/.claude/skills/avatar-boot-starter-nacos/references//345/212/237/350/203/275/344/275/277/347/224/250.md +134 -0
- package/templates/.claude/skills/avatar-boot-starter-nacos/references//345/277/253/351/200/237/346/216/245/345/205/245/344/270/216/351/205/215/347/275/256.md +96 -0
- package/templates/.claude/skills/avatar-boot-starter-nacos/references//346/225/205/351/232/234/346/216/222/346/237/245.md +64 -0
- package/templates/.claude/skills/avatar-boot-starter-oss/README.md +594 -0
- package/templates/.claude/skills/avatar-boot-starter-oss/SKILL.md +76 -0
- package/templates/.claude/skills/avatar-boot-starter-oss/references//345/277/253/351/200/237/346/216/245/345/205/245/344/270/216/351/205/215/347/275/256.md +77 -0
- package/templates/.claude/skills/avatar-boot-starter-oss/references//346/240/270/345/277/203/345/212/237/350/203/275.md +94 -0
- package/templates/.claude/skills/avatar-boot-starter-oss/references//350/247/204/350/214/203/344/270/216/346/263/250/346/204/217/344/272/213/351/241/271.md +61 -0
- package/templates/.claude/skills/avatar-boot-starter-redis/README.md +586 -0
- package/templates/.claude/skills/avatar-boot-starter-redis/SKILL.md +62 -0
- package/templates/.claude/skills/avatar-boot-starter-redis/references//345/277/253/351/200/237/346/216/245/345/205/245/344/270/216/351/205/215/347/275/256.md +78 -0
- package/templates/.claude/skills/avatar-boot-starter-redis/references//346/225/260/346/215/256/346/223/215/344/275/234.md +111 -0
- package/templates/.claude/skills/avatar-boot-starter-redis/references//351/253/230/347/272/247/345/212/237/350/203/275.md +90 -0
- package/templates/.claude/skills/avatar-boot-starter-rocketmq/README.md +662 -0
- package/templates/.claude/skills/avatar-boot-starter-rocketmq/SKILL.md +70 -0
- package/templates/.claude/skills/avatar-boot-starter-rocketmq/references//346/240/270/345/277/203/345/212/237/350/203/275.md +101 -0
- package/templates/.claude/skills/avatar-boot-starter-rocketmq/references//351/205/215/347/275/256/344/270/216/346/263/250/346/204/217/344/272/213/351/241/271.md +44 -0
- package/templates/.claude/skills/avatar-boot-starter-rocketmq/references//351/253/230/347/272/247/347/211/271/346/200/247.md +71 -0
- package/templates/.claude/skills/avatar-boot-starter-web/README.md +1007 -0
- package/templates/.claude/skills/avatar-boot-starter-web/SKILL.md +154 -0
- package/templates/.claude/skills/avatar-boot-starter-web/references//345/212/237/350/203/275-LogInfo/346/263/250/350/247/243.md +75 -0
- package/templates/.claude/skills/avatar-boot-starter-web/references//345/212/237/350/203/275-/345/205/250/345/261/200/345/274/202/345/270/270/345/244/204/347/220/206.md +90 -0
- package/templates/.claude/skills/avatar-boot-starter-web/references//345/212/237/350/203/275-/346/214/207/346/240/207/347/233/221/346/216/247.md +74 -0
- package/templates/.claude/skills/avatar-boot-starter-web/references//345/212/237/350/203/275-/346/227/245/345/277/227/344/275/223/347/263/273.md +73 -0
- package/templates/.claude/skills/avatar-boot-starter-web/references//345/212/237/350/203/275-/350/257/267/346/261/202/344/270/212/344/270/213/346/226/207.md +77 -0
- package/templates/.claude/skills/avatar-boot-starter-web/references//345/277/253/351/200/237/346/216/245/345/205/245/346/214/207/345/215/227.md +52 -0
- package/templates/.claude/skills/avatar-boot-starter-web/references//346/263/250/346/204/217/344/272/213/351/241/271.md +68 -0
- package/templates/.claude/skills/avatar-boot-starter-web/references//350/207/252/345/256/232/344/271/211/346/211/251/345/261/225/346/214/207/345/215/227.md +107 -0
- package/templates/.claude/skills/avatar-boot-starter-web/references//351/205/215/347/275/256/345/217/202/350/200/203.md +107 -0
- package/templates/.claude/skills/changelog-generator/SKILL.md +114 -0
- package/templates/.claude/skills/code-review/SKILL.md +239 -0
- package/templates/.claude/skills/crud-generator/SKILL.md +893 -0
- package/templates/.claude/skills/database-design/README.md +207 -0
- package/templates/.claude/skills/database-design/SKILL.md +764 -0
- package/templates/.claude/skills/database-design/references//345/221/275/345/220/215/350/247/204/350/214/203.md +232 -0
- package/templates/.claude/skills/database-design/references//345/255/227/346/256/265/347/261/273/345/236/213/350/247/204/350/214/203.md +400 -0
- package/templates/.claude/skills/database-design/references//347/264/242/345/274/225/350/247/204/350/214/203.md +506 -0
- package/templates/.claude/skills/deployment-config/SKILL.md +277 -0
- package/templates/.claude/skills/incident-analysis/SKILL.md +241 -0
- package/templates/.claude/skills/integration-test-generator/SKILL.md +496 -0
- package/templates/.claude/skills/prompt-engineering/SKILL.md +249 -0
- package/templates/.claude/skills/requirement-management/SKILL.md +244 -0
- package/templates/.claude/skills/security-audit/SKILL.md +330 -0
- package/templates/.claude/skills/test-case-design/SKILL.md +257 -0
- package/templates/.claude/skills/testing-workflow/SKILL.md +68 -0
- package/templates/.claude/skills/troubleshooting/SKILL.md +240 -0
- package/templates/CLAUDE.md +173 -0
- package/templates/README.md +268 -0
- package/templates/avatar-scaffold-api/pom.xml +36 -0
- package/templates/avatar-scaffold-api/src/main/java/com/iflytek/avatar/login/api/LoginFeignClient.java +42 -0
- package/templates/avatar-scaffold-api/src/main/java/com/iflytek/avatar/login/constant/LoginConstant.java +21 -0
- package/templates/avatar-scaffold-api/src/main/java/com/iflytek/avatar/login/dto/request/LoginRequest.java +17 -0
- package/templates/avatar-scaffold-api/src/main/java/com/iflytek/avatar/login/dto/request/RefreshTokenRequest.java +14 -0
- package/templates/avatar-scaffold-api/src/main/java/com/iflytek/avatar/login/dto/response/LoginResponse.java +31 -0
- package/templates/avatar-scaffold-api/src/main/java/com/iflytek/avatar/login/dto/response/TokenInfoResponse.java +25 -0
- package/templates/avatar-scaffold-api/src/main/java/com/iflytek/avatar/login/enums/LoginTypeEnum.java +23 -0
- package/templates/avatar-scaffold-api/src/main/java/com/iflytek/avatar/login/exception/LoginErrorCode.java +25 -0
- package/templates/avatar-scaffold-api/src/main/java/com/iflytek/avatar/login/exception/LoginException.java +23 -0
- package/templates/avatar-scaffold-service/k8s-app/Dockerfile +14 -0
- package/templates/avatar-scaffold-service/k8s-app/Dockerfile-arm64 +14 -0
- package/templates/avatar-scaffold-service/packaging/assembly.xml +16 -0
- package/templates/avatar-scaffold-service/pom.xml +88 -0
- package/templates/avatar-scaffold-service/src/main/java/com/iflytek/avatar/Application.java +21 -0
- package/templates/avatar-scaffold-service/src/main/java/com/iflytek/avatar/login/config/LoginConfig.java +20 -0
- package/templates/avatar-scaffold-service/src/main/java/com/iflytek/avatar/login/controller/LoginController.java +37 -0
- package/templates/avatar-scaffold-service/src/main/java/com/iflytek/avatar/login/converter/LoginConverter.java +54 -0
- package/templates/avatar-scaffold-service/src/main/java/com/iflytek/avatar/login/feign/DemoFeign.java +24 -0
- package/templates/avatar-scaffold-service/src/main/java/com/iflytek/avatar/login/repository/UserLoginRepository.java +10 -0
- package/templates/avatar-scaffold-service/src/main/java/com/iflytek/avatar/login/repository/entity/UserLoginEntity.java +33 -0
- package/templates/avatar-scaffold-service/src/main/java/com/iflytek/avatar/login/repository/entity/UserTokenEntity.java +39 -0
- package/templates/avatar-scaffold-service/src/main/java/com/iflytek/avatar/login/repository/mapper/UserLoginMapper.java +23 -0
- package/templates/avatar-scaffold-service/src/main/java/com/iflytek/avatar/login/service/LoginService.java +22 -0
- package/templates/avatar-scaffold-service/src/main/java/com/iflytek/avatar/login/service/impl/LoginServiceImpl.java +43 -0
- package/templates/avatar-scaffold-service/src/main/java/com/iflytek/avatar/login/utils/LoginUtils.java +31 -0
- package/templates/avatar-scaffold-service/src/main/resources/application-dev.yaml +26 -0
- package/templates/avatar-scaffold-service/src/main/resources/application-local.yaml +61 -0
- package/templates/avatar-scaffold-service/src/main/resources/application-prod.yaml +25 -0
- package/templates/avatar-scaffold-service/src/main/resources/application-test.yaml +26 -0
- package/templates/avatar-scaffold-service/src/main/resources/application.yaml +12 -0
- package/templates/pom.xml +89 -0
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
# OSS 快速接入与配置
|
|
2
|
+
|
|
3
|
+
## 1. 添加依赖
|
|
4
|
+
|
|
5
|
+
```xml
|
|
6
|
+
<dependency>
|
|
7
|
+
<groupId>com.iflytek.avatar.boot</groupId>
|
|
8
|
+
<artifactId>avatar-boot-starter-oss</artifactId>
|
|
9
|
+
</dependency>
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
## 2. 配置连接信息
|
|
13
|
+
|
|
14
|
+
```yaml
|
|
15
|
+
avatar:
|
|
16
|
+
oss:
|
|
17
|
+
enabled: true
|
|
18
|
+
type: ALIOSS # ALIOSS / MINIO / TXCOS / AWS3
|
|
19
|
+
endpoint: https://oss-cn-beijing.aliyuncs.com
|
|
20
|
+
bucket: your-bucket-name
|
|
21
|
+
access-key: ${OSS_ACCESS_KEY} # 通过环境变量注入,禁止明文
|
|
22
|
+
access-secret: ${OSS_ACCESS_SECRET}
|
|
23
|
+
region: default
|
|
24
|
+
use-ssl: false
|
|
25
|
+
virtual-host: false
|
|
26
|
+
cdn-endpoint: https://your-cdn.com # CDN 域名,无 CDN 时填同 endpoint
|
|
27
|
+
project-name: your-service-name
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
## 3. 注入使用
|
|
31
|
+
|
|
32
|
+
```java
|
|
33
|
+
@Autowired
|
|
34
|
+
private OssClient ossClient;
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
`@ConditionalOnProperty(name = "enabled", havingValue = "true")` 自动生效,无需额外注解。
|
|
38
|
+
|
|
39
|
+
## 配置项说明
|
|
40
|
+
|
|
41
|
+
| 配置项 | 必填 | 默认值 | 说明 |
|
|
42
|
+
|:--|:--|:--|:--|
|
|
43
|
+
| `enabled` | 是 | `false` | 是否启用 OSS |
|
|
44
|
+
| `type` | 是 | — | 存储类型 |
|
|
45
|
+
| `endpoint` | 是 | — | 存储服务域名 |
|
|
46
|
+
| `bucket` | 是 | — | 存储空间名称 |
|
|
47
|
+
| `access-key` | 是 | — | 访问密钥 ID |
|
|
48
|
+
| `access-secret` | 是 | — | 访问密钥 Secret |
|
|
49
|
+
| `region` | 否 | `default` | 区域(MinIO 填 default) |
|
|
50
|
+
| `use-ssl` | 否 | `false` | 是否启用 HTTPS |
|
|
51
|
+
| `cdn-endpoint` | 否 | 同 endpoint | CDN 加速域名 |
|
|
52
|
+
| `thread-pool.enable-multipart-upload-size` | 否 | `50` | 触发分片上传的文件大小(MB) |
|
|
53
|
+
| `thread-pool.part-size` | 否 | `10` | 每个分片大小(MB) |
|
|
54
|
+
|
|
55
|
+
## 各 OSS 类型推荐配置
|
|
56
|
+
|
|
57
|
+
### 阿里云 OSS
|
|
58
|
+
|
|
59
|
+
```yaml
|
|
60
|
+
avatar:
|
|
61
|
+
oss:
|
|
62
|
+
type: ALIOSS
|
|
63
|
+
endpoint: https://oss-cn-beijing.aliyuncs.com
|
|
64
|
+
virtual-host: false
|
|
65
|
+
region: default
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
### MinIO
|
|
69
|
+
|
|
70
|
+
```yaml
|
|
71
|
+
avatar:
|
|
72
|
+
oss:
|
|
73
|
+
type: MINIO
|
|
74
|
+
endpoint: http://minio:9000
|
|
75
|
+
use-ssl: false
|
|
76
|
+
region: default
|
|
77
|
+
```
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
# OSS 核心功能
|
|
2
|
+
|
|
3
|
+
## 文件上传
|
|
4
|
+
|
|
5
|
+
```java
|
|
6
|
+
// 方式一:字节数组上传(后端服务生成文件时使用)
|
|
7
|
+
String fileKey = OssFileKeyHelper.videoKey(tenantId, taskId, "output.mp4");
|
|
8
|
+
String cdnUrl = ossClient.upload(fileBytes, fileKey, "video/mp4");
|
|
9
|
+
// cdnUrl 仅用于即时展示,入库时存 {bucket}/{fileKey} 格式
|
|
10
|
+
|
|
11
|
+
// 方式二:本地文件路径上传
|
|
12
|
+
String cdnUrl = ossClient.upload("/tmp/output.mp4", fileKey, "video/mp4");
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
## 预签名上传(前端直传)
|
|
16
|
+
|
|
17
|
+
适合客户端直接上传素材,流量不经过业务服务器:
|
|
18
|
+
|
|
19
|
+
```java
|
|
20
|
+
String fileKey = OssFileKeyHelper.materialKey(tenantId, "source.mp4");
|
|
21
|
+
PresignResult result = ossClient.getPresignUploadUrl(fileKey, "video/mp4", Duration.ofMinutes(30));
|
|
22
|
+
|
|
23
|
+
result.getUrl(); // 预签名上传地址,前端 PUT 到此地址
|
|
24
|
+
result.getSignedHeaders(); // 上传时必须携带的额外 header
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
前端上传示例:
|
|
28
|
+
```javascript
|
|
29
|
+
// 阿里云:signedHeaders 为空,直接 PUT
|
|
30
|
+
await fetch(result.url, {
|
|
31
|
+
method: 'PUT',
|
|
32
|
+
headers: { 'Content-Type': 'video/mp4', ...result.signedHeaders },
|
|
33
|
+
body: file
|
|
34
|
+
});
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
## 预签名下载(临时授权访问)
|
|
38
|
+
|
|
39
|
+
```java
|
|
40
|
+
PresignResult result = ossClient.getPresignDownloadUrl(fileKey, Duration.ofHours(2));
|
|
41
|
+
String accessUrl = result.getUrl(); // 可直接访问的签名 URL
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
## URL 解析(接口返回文件 URL 时统一使用)
|
|
45
|
+
|
|
46
|
+
```java
|
|
47
|
+
// 自动处理新旧格式,默认有效期 2 小时
|
|
48
|
+
String accessUrl = ossClient.resolveAccessUrl(dbStoredValue);
|
|
49
|
+
|
|
50
|
+
// 自定义有效期
|
|
51
|
+
String accessUrl = ossClient.resolveAccessUrl(dbStoredValue, Duration.ofHours(4));
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
| DB 中的值 | 处理结果 |
|
|
55
|
+
|:--|:--|
|
|
56
|
+
| `bucket/videos/.../output.mp4`(新格式) | 动态生成 CDN 签名 URL |
|
|
57
|
+
| `https://cdn.old.com/.../output.mp4`(旧格式完整 URL) | 直接返回原值 |
|
|
58
|
+
|
|
59
|
+
## 文件下载到本地
|
|
60
|
+
|
|
61
|
+
```java
|
|
62
|
+
// 普通下载
|
|
63
|
+
ossClient.download(fileKey, "/tmp/output.mp4");
|
|
64
|
+
|
|
65
|
+
// 大文件分片下载(推荐 1GB 以上使用)
|
|
66
|
+
ossClient.multipartDownload(fileKey, "/tmp/", "output.mp4");
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
## 文件删除
|
|
70
|
+
|
|
71
|
+
```java
|
|
72
|
+
// 删除单个文件
|
|
73
|
+
ossClient.delete(fileKey);
|
|
74
|
+
|
|
75
|
+
// 批量删除(任务完成后清理临时文件)
|
|
76
|
+
ossClient.deleteMultiple(List.of(key1, key2, key3));
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
## 前端分片上传(大文件)
|
|
80
|
+
|
|
81
|
+
```java
|
|
82
|
+
// 1. 初始化分片任务
|
|
83
|
+
String uploadId = ossClient.createMultipartUpload(fileKey, "video/mp4", Duration.ofHours(1));
|
|
84
|
+
|
|
85
|
+
// 2. 生成各分片预签名 URL,返回前端(每片约 5MB)
|
|
86
|
+
List<String> partUrls = ossClient.getMultipartUploadUrls(fileKey, uploadId, totalBytes, Duration.ofHours(1));
|
|
87
|
+
|
|
88
|
+
// 3. 前端按顺序 PUT 上传各分片,收集 ETag 后通知后端合并
|
|
89
|
+
List<UploadPart> parts = /* 前端传回的 partNumber + ETag 列表 */;
|
|
90
|
+
String cdnUrl = ossClient.completeMultipartUpload(fileKey, uploadId, parts);
|
|
91
|
+
|
|
92
|
+
// 异常情况:取消并清理已上传分片
|
|
93
|
+
ossClient.abortMultipartUpload(fileKey, uploadId, Duration.ofHours(1));
|
|
94
|
+
```
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# OSS 规范与注意事项
|
|
2
|
+
|
|
3
|
+
## 文件路径规范
|
|
4
|
+
|
|
5
|
+
**路径由服务端统一生成,禁止客户端自定义**,使用 `OssFileKeyHelper` 工具类:
|
|
6
|
+
|
|
7
|
+
```java
|
|
8
|
+
// 客户上传素材:materials/{tenantId}/{yyyy}/{MM}/{dd}/{uuid}/{filename}
|
|
9
|
+
String key = OssFileKeyHelper.materialKey("tenant01", "avatar.mp4");
|
|
10
|
+
// → materials/tenant01/2026/03/13/2495d79518da.../avatar.mp4
|
|
11
|
+
|
|
12
|
+
// 平台生成视频:videos/{tenantId}/{yyyy}/{MM}/{dd}/{taskId}/{filename}
|
|
13
|
+
String key = OssFileKeyHelper.videoKey("tenant01", "task-789", "output.mp4");
|
|
14
|
+
// → videos/tenant01/2026/03/13/task-789/output.mp4
|
|
15
|
+
|
|
16
|
+
// 临时中间文件:temp/{serviceName}/{yyyy}/{MM}/{dd}/{taskId}/{filename}
|
|
17
|
+
String key = OssFileKeyHelper.tempKey("render-svc", "task-789", "frame_001.jpg");
|
|
18
|
+
// → temp/render-svc/2026/03/13/task-789/frame_001.jpg
|
|
19
|
+
|
|
20
|
+
// 前端静态资源:static/{version}/{filename}
|
|
21
|
+
String key = OssFileKeyHelper.staticKey("v1.2.3", "app.abc123.js");
|
|
22
|
+
// → static/v1.2.3/app.abc123.js
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## DB 存储规范
|
|
26
|
+
|
|
27
|
+
**DB 中只存 `{bucket}/{filekey}`,不存完整 URL**:
|
|
28
|
+
|
|
29
|
+
```
|
|
30
|
+
asset/videos/tenant01/2026/03/13/task-789/output.mp4
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
访问时调用 `ossClient.resolveAccessUrl(storedValue)` 动态生成签名 URL。
|
|
34
|
+
|
|
35
|
+
## FileKey 编码(接口传参用)
|
|
36
|
+
|
|
37
|
+
fileKey 含大量斜杠,作为接口参数时使用 Base64URL 编码:
|
|
38
|
+
|
|
39
|
+
```java
|
|
40
|
+
// 编码:上传后对外暴露
|
|
41
|
+
String encodedKey = OssFileKeyHelper.encodeKey(fileKey);
|
|
42
|
+
|
|
43
|
+
// 解码:接收到 encodedKey 后还原
|
|
44
|
+
String rawKey = OssFileKeyHelper.decodeKey(encodedKey);
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
**约定**:
|
|
48
|
+
- 上传接口响应的 `fileKey` 字段返回**编码后**的值
|
|
49
|
+
- 下载/预签名/删除接口接收编码值,内部自动解码;传入原始路径也兼容
|
|
50
|
+
|
|
51
|
+
## 注意事项
|
|
52
|
+
|
|
53
|
+
1. **AK/SK 安全**:生产环境通过环境变量或 Nacos 加密配置注入,**禁止明文写入代码仓库**
|
|
54
|
+
|
|
55
|
+
2. **临时文件清理**:`temp/` 前缀文件在任务完成后必须主动调用 `delete()` 清理,同时在存储侧配置 Lifecycle Policy 7 天兜底过期删除
|
|
56
|
+
|
|
57
|
+
3. **分片任务异常**:分片上传中断后若未调用 `abortMultipartUpload`,存储侧会产生碎片,建议配置 Lifecycle Policy 3 天清理未完成分片
|
|
58
|
+
|
|
59
|
+
4. **Nacos 动态刷新**:修改 `avatar.oss.*` 配置后需**重启应用**,不支持运行时热刷新(IOSS SDK 为单例初始化)
|
|
60
|
+
|
|
61
|
+
5. **MinIO/COS/S3 的 signedHeaders**:预签名 URL 可能含 `x-amz-te` 等 header,前端上传时必须携带,阿里云 OSS 的 signedHeaders 为空 Map
|