Compare commits
112 Commits
v4.4.0-bet
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
634babfba4 | ||
|
|
e7fe1afe19 | ||
|
|
171762d676 | ||
|
|
76e091900b | ||
|
|
bfa4ceab90 | ||
|
|
b18cfa797a | ||
|
|
8a117a41e8 | ||
|
|
17ba41320e | ||
|
|
476c0bfefc | ||
|
|
1c6691d785 | ||
|
|
36ae290cb6 | ||
|
|
597715ce33 | ||
|
|
a8a08c1dcc | ||
|
|
7757729efd | ||
|
|
b246bfdac7 | ||
|
|
d35393ba22 | ||
|
|
c893dd7095 | ||
|
|
9bdb18d833 | ||
|
|
58fc1af74f | ||
|
|
1b3cf33bf0 | ||
|
|
c9005d0c04 | ||
|
|
37bda20d08 | ||
|
|
1819861647 | ||
|
|
352b86b40d | ||
|
|
853ad0154f | ||
|
|
c88bf04a0d | ||
|
|
6a84e61ecb | ||
|
|
dd6e369e6a | ||
|
|
bd20546b6d | ||
|
|
c41c14bf3c | ||
|
|
3fbf0156e2 | ||
|
|
530304b832 | ||
|
|
5499150395 | ||
|
|
2dcc62f3da | ||
|
|
405a12ef07 | ||
|
|
bb0734b3d3 | ||
|
|
a9e394950f | ||
|
|
be6023701c | ||
|
|
02bcd35779 | ||
|
|
b6dd8129ea | ||
|
|
db5cd68a1e | ||
|
|
d1c310ab63 | ||
|
|
b10e14899d | ||
|
|
eee3a2ed38 | ||
|
|
68d4d23a4b | ||
|
|
bb457924cd | ||
|
|
a0d78c57e3 | ||
|
|
7f16243270 | ||
|
|
36a75e86ac | ||
|
|
7c41200028 | ||
|
|
3da0c523e8 | ||
|
|
8c3bc81e08 | ||
|
|
9d72706c2d | ||
|
|
0aa8de27d4 | ||
|
|
b08f4657e5 | ||
|
|
1e04822532 | ||
|
|
4e5e9b7cba | ||
|
|
a2fe4658c4 | ||
|
|
e43f10138f | ||
|
|
7dc0469b30 | ||
|
|
904af89190 | ||
|
|
2425bea9b6 | ||
|
|
b5579ae890 | ||
|
|
595f3f55f2 | ||
|
|
c96b7ebd1e | ||
|
|
9a3ec88390 | ||
|
|
ea35da6694 | ||
|
|
00a8e094db | ||
|
|
58d0b24b16 | ||
|
|
b20637652a | ||
|
|
e1e146cb5f | ||
|
|
e52f374252 | ||
|
|
daab5963bc | ||
|
|
38a9c142e2 | ||
|
|
4afe1caa33 | ||
|
|
2dd008532a | ||
|
|
92ca92bee6 | ||
|
|
64c82a2406 | ||
|
|
e44ef813a1 | ||
|
|
9f3b45a4c7 | ||
|
|
b1af0c7d72 | ||
|
|
421640221b | ||
|
|
f6c6e22b0d | ||
|
|
51653483b9 | ||
|
|
a9787b0add | ||
|
|
6cdbf92fb0 | ||
|
|
fdb40680d3 | ||
|
|
6746325bf2 | ||
|
|
05a8bff1e0 | ||
|
|
874ff5b3f6 | ||
|
|
2230cfa52b | ||
|
|
83c581364d | ||
|
|
1d39360c60 | ||
|
|
8c763599fe | ||
|
|
9632f6070c | ||
|
|
cc63659650 | ||
|
|
177f389814 | ||
|
|
406e9ea6ee | ||
|
|
bb461cd74a | ||
|
|
782509376c | ||
|
|
63dc58d088 | ||
|
|
77f5adb19f | ||
|
|
7abfb67451 | ||
|
|
c8dc638c29 | ||
|
|
48ac926289 | ||
|
|
0a4ae41b0c | ||
|
|
bb0139bee6 | ||
|
|
7bf07cb64c | ||
|
|
ab370e66a5 | ||
|
|
421a2760d5 | ||
|
|
9150346926 | ||
|
|
b65a04857c |
5
.github/ISSUE_TEMPLATE/config.yml
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
blank_issues_enabled: false
|
||||
contact_links:
|
||||
- name: "Security Report / 安全漏洞报告"
|
||||
url: "https://github.com/kekingcn/kkFileView/security/advisories/new"
|
||||
about: "For sensitive security issues, please use private security report. / 涉及敏感安全问题请使用私密安全报告。"
|
||||
76
.github/ISSUE_TEMPLATE/feature-request.yml
vendored
Normal file
@@ -0,0 +1,76 @@
|
||||
name: "Feature Request / 功能建议"
|
||||
description: "Propose a new feature with clear use case and acceptance criteria. / 提交功能建议,请明确场景与验收标准。"
|
||||
title: "[FEATURE] "
|
||||
labels: ["type/feature", "priority/p2", "status/needs-info"]
|
||||
body:
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: |
|
||||
Thanks for your idea! / 感谢你的建议!
|
||||
|
||||
Please provide concrete business scenarios and the expected behavior.
|
||||
请尽量提供明确业务场景和期望行为,便于评估优先级与实现方案。
|
||||
|
||||
For urgent production issues, you can use our Knowledge Planet channel for faster processing:
|
||||
https://wx.zsxq.com/group/48844125114258
|
||||
如为线上紧急问题,可通过知识星球渠道加速处理:
|
||||
https://wx.zsxq.com/group/48844125114258
|
||||
|
||||
- type: textarea
|
||||
id: background
|
||||
attributes:
|
||||
label: "Background / 背景"
|
||||
description: "What problem are you trying to solve? / 你要解决什么问题?"
|
||||
placeholder: "Describe current pain points... / 描述当前痛点..."
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
id: proposal
|
||||
attributes:
|
||||
label: "Proposal / 建议方案"
|
||||
description: "What do you expect kkFileView to support? / 期望 kkFileView 支持什么?"
|
||||
placeholder: "Describe expected feature behavior... / 描述期望功能行为..."
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
id: use_case
|
||||
attributes:
|
||||
label: "Use Case / 使用场景"
|
||||
description: "Provide 1-3 concrete scenarios. / 提供 1-3 个具体场景"
|
||||
placeholder: |
|
||||
Scenario 1:
|
||||
Scenario 2:
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
id: alternatives
|
||||
attributes:
|
||||
label: "Alternatives / 备选方案"
|
||||
description: "What alternatives have you considered? / 是否考虑过替代方案?"
|
||||
placeholder: "Existing workaround or alternative... / 当前替代做法..."
|
||||
validations:
|
||||
required: false
|
||||
|
||||
- type: textarea
|
||||
id: acceptance
|
||||
attributes:
|
||||
label: "Acceptance Criteria / 验收标准"
|
||||
description: "How do we know this feature is done? / 如何判断该功能完成?"
|
||||
placeholder: |
|
||||
- [ ] Criterion 1
|
||||
- [ ] Criterion 2
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: checkboxes
|
||||
id: checklist
|
||||
attributes:
|
||||
label: "Checklist / 提交前检查"
|
||||
options:
|
||||
- label: "I have searched existing issues and did not find a duplicate feature request. / 我已搜索现有 issue,未发现重复功能建议"
|
||||
required: true
|
||||
- label: "I provided concrete use cases and expected behavior. / 我已提供具体使用场景和期望行为"
|
||||
required: true
|
||||
121
.github/ISSUE_TEMPLATE/issue-report.yml
vendored
Normal file
@@ -0,0 +1,121 @@
|
||||
name: "Issue Report / 问题反馈"
|
||||
description: "Please provide complete required information to help us reproduce and follow up. / 请完整填写必填信息,便于复现与跟进。"
|
||||
title: "[ISSUE] "
|
||||
labels: ["status/needs-info"]
|
||||
body:
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: |
|
||||
Thanks for your report! / 感谢反馈!
|
||||
|
||||
**Please fill in all required fields.**
|
||||
**请完整填写所有必填项。**
|
||||
|
||||
Incomplete issues may be closed and asked to resubmit.
|
||||
信息不完整的问题可能会被关闭并要求重新提交。
|
||||
|
||||
For urgent production issues, you can use our Knowledge Planet channel for faster processing:
|
||||
https://wx.zsxq.com/group/48844125114258
|
||||
如为线上紧急问题,可通过知识星球渠道加速处理:
|
||||
https://wx.zsxq.com/group/48844125114258
|
||||
|
||||
- type: dropdown
|
||||
id: issue_type
|
||||
attributes:
|
||||
label: "Issue Type / 问题类型"
|
||||
description: "Select the closest type. / 请选择最接近的问题类型"
|
||||
options:
|
||||
- "Bug / 缺陷"
|
||||
- "Performance / 性能问题"
|
||||
- "Security / 安全问题"
|
||||
- "Question / 使用咨询"
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: input
|
||||
id: kkfileview_version
|
||||
attributes:
|
||||
label: "kkFileView Version / kkFileView 版本"
|
||||
placeholder: "e.g. 4.4.0"
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: input
|
||||
id: deploy_mode
|
||||
attributes:
|
||||
label: "Deployment Mode / 部署方式"
|
||||
description: "jar / docker / k8s / source, etc. / jar / docker / k8s / 源码部署等"
|
||||
placeholder: "e.g. docker"
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
id: environment
|
||||
attributes:
|
||||
label: "Environment / 环境信息"
|
||||
description: "OS, JDK, LibreOffice/OpenOffice, browser, reverse proxy, etc. / 操作系统、JDK、Office组件、浏览器、反向代理等"
|
||||
placeholder: |
|
||||
- OS:
|
||||
- JDK:
|
||||
- LibreOffice/OpenOffice:
|
||||
- Browser:
|
||||
- Proxy (Nginx/Ingress):
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
id: reproduce_steps
|
||||
attributes:
|
||||
label: "Steps to Reproduce / 复现步骤"
|
||||
description: "Provide clear, minimal, reproducible steps. / 提供清晰、最小可复现步骤"
|
||||
placeholder: |
|
||||
1) ...
|
||||
2) ...
|
||||
3) ...
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
id: expected_result
|
||||
attributes:
|
||||
label: "Expected Result / 期望结果"
|
||||
placeholder: "What should happen? / 期望实际应该出现什么结果?"
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
id: actual_result
|
||||
attributes:
|
||||
label: "Actual Result / 实际结果"
|
||||
placeholder: "What happened instead? / 实际发生了什么?"
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
id: logs
|
||||
attributes:
|
||||
label: "Logs & Screenshots / 日志与截图"
|
||||
description: "Paste key logs/error stack and attach screenshots (mask sensitive data). / 粘贴关键日志或异常堆栈,并上传截图(请脱敏)"
|
||||
render: shell
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
id: sample_file
|
||||
attributes:
|
||||
label: "Sample File / 样例文件(可选)"
|
||||
description: "If possible, provide a minimal sample file or reproducible URL (desensitized). / 如可提供,请附最小样例文件或可复现 URL(脱敏)"
|
||||
validations:
|
||||
required: false
|
||||
|
||||
- type: checkboxes
|
||||
id: checklist
|
||||
attributes:
|
||||
label: "Checklist / 提交前检查"
|
||||
options:
|
||||
- label: "I have searched existing issues and did not find a duplicate. / 我已搜索现有 issue,未发现重复问题"
|
||||
required: true
|
||||
- label: "I can reproduce this issue on the stated version/environment. / 我可在上述版本与环境复现该问题"
|
||||
required: true
|
||||
- label: "I have masked sensitive information in logs/screenshots. / 我已对日志与截图中的敏感信息做脱敏处理"
|
||||
required: true
|
||||
117
.github/scripts/deploy_windows_winrm.py
vendored
Normal file
@@ -0,0 +1,117 @@
|
||||
#!/usr/bin/env python3
|
||||
import base64
|
||||
import os
|
||||
import pathlib
|
||||
import sys
|
||||
import uuid
|
||||
|
||||
import winrm
|
||||
|
||||
|
||||
def require_env(name: str) -> str:
|
||||
value = os.getenv(name, "").strip()
|
||||
if not value:
|
||||
raise SystemExit(f"Missing required environment variable: {name}")
|
||||
return value
|
||||
|
||||
|
||||
def optional_env(name: str, default: str) -> str:
|
||||
value = os.getenv(name, "").strip()
|
||||
return value if value else default
|
||||
|
||||
|
||||
def ps_quote(value: str) -> str:
|
||||
return value.replace("'", "''")
|
||||
|
||||
|
||||
def main() -> int:
|
||||
host = require_env("KK_DEPLOY_HOST")
|
||||
port = optional_env("KK_DEPLOY_PORT", "5985")
|
||||
username = require_env("KK_DEPLOY_USERNAME")
|
||||
password = require_env("KK_DEPLOY_PASSWORD")
|
||||
env_pairs = {
|
||||
"KK_DEPLOY_ROOT": optional_env("KK_DEPLOY_ROOT", r"C:\kkFileView-5.0"),
|
||||
"KK_DEPLOY_HEALTH_URL": optional_env("KK_DEPLOY_HEALTH_URL", "http://127.0.0.1:8012/"),
|
||||
"KK_DEPLOY_REPO_URL": optional_env("KK_DEPLOY_REPO_URL", "https://github.com/kekingcn/kkFileView.git"),
|
||||
"KK_DEPLOY_BRANCH": optional_env("KK_DEPLOY_BRANCH", "master"),
|
||||
"KK_DEPLOY_SOURCE_ROOT": optional_env("KK_DEPLOY_SOURCE_ROOT", r"C:\kkFileView-source"),
|
||||
"KK_DEPLOY_JAVA_HOME": optional_env("KK_DEPLOY_JAVA_HOME", r"C:\Program Files\jdk-21.0.2"),
|
||||
"KK_DEPLOY_GIT_EXE": optional_env("KK_DEPLOY_GIT_EXE", r"C:\kkFileView-tools\git\cmd\git.exe"),
|
||||
"KK_DEPLOY_MVN_CMD": optional_env("KK_DEPLOY_MVN_CMD", r"C:\kkFileView-tools\maven\bin\mvn.cmd"),
|
||||
"KK_DEPLOY_MAVEN_SETTINGS": optional_env("KK_DEPLOY_MAVEN_SETTINGS", ""),
|
||||
"KK_DEPLOY_DRY_RUN": optional_env("KK_DEPLOY_DRY_RUN", "false").lower(),
|
||||
}
|
||||
|
||||
script_path = pathlib.Path(__file__).with_name("remote_windows_deploy.ps1")
|
||||
script_body = script_path.read_text(encoding="utf-8")
|
||||
payload = script_body.encode("utf-8-sig")
|
||||
payload_b64 = base64.b64encode(payload).decode("ascii")
|
||||
|
||||
endpoint = f"http://{host}:{port}/wsman"
|
||||
session = winrm.Session(endpoint, auth=(username, password), transport="ntlm")
|
||||
|
||||
suffix = uuid.uuid4().hex
|
||||
remote_b64_path = fr"C:\Windows\Temp\kkfileview_deploy_{suffix}.b64"
|
||||
remote_ps1_path = fr"C:\Windows\Temp\kkfileview_deploy_{suffix}.ps1"
|
||||
|
||||
prep = session.run_ps(
|
||||
f"""
|
||||
$ErrorActionPreference = 'Stop'
|
||||
if (Test-Path '{ps_quote(remote_b64_path)}') {{ Remove-Item '{ps_quote(remote_b64_path)}' -Force }}
|
||||
if (Test-Path '{ps_quote(remote_ps1_path)}') {{ Remove-Item '{ps_quote(remote_ps1_path)}' -Force }}
|
||||
New-Item -ItemType File -Path '{ps_quote(remote_b64_path)}' -Force | Out-Null
|
||||
"""
|
||||
)
|
||||
if prep.status_code != 0:
|
||||
sys.stderr.write(prep.std_err.decode("utf-8", errors="ignore"))
|
||||
return prep.status_code
|
||||
|
||||
chunk_size = 1200
|
||||
for start in range(0, len(payload_b64), chunk_size):
|
||||
chunk = payload_b64[start : start + chunk_size]
|
||||
append = session.run_ps(
|
||||
f"Add-Content -LiteralPath '{ps_quote(remote_b64_path)}' -Value '{chunk}'"
|
||||
)
|
||||
if append.status_code != 0:
|
||||
sys.stderr.write(append.std_err.decode("utf-8", errors="ignore"))
|
||||
return append.status_code
|
||||
|
||||
result = session.run_ps(
|
||||
f"""
|
||||
$ErrorActionPreference = 'Stop'
|
||||
$raw = Get-Content -LiteralPath '{ps_quote(remote_b64_path)}' -Raw
|
||||
[System.IO.File]::WriteAllBytes('{ps_quote(remote_ps1_path)}', [Convert]::FromBase64String($raw))
|
||||
try {{
|
||||
"""
|
||||
+ "\n".join(
|
||||
f" $env:{key} = '{ps_quote(value)}'" for key, value in env_pairs.items()
|
||||
)
|
||||
+ f"""
|
||||
powershell -NoProfile -ExecutionPolicy Bypass -File '{ps_quote(remote_ps1_path)}' `
|
||||
$code = $LASTEXITCODE
|
||||
}} finally {{
|
||||
"""
|
||||
+ "\n".join(
|
||||
f" Remove-Item Env:{key} -ErrorAction SilentlyContinue" for key in env_pairs
|
||||
)
|
||||
+ f"""
|
||||
Remove-Item '{ps_quote(remote_b64_path)}' -Force -ErrorAction SilentlyContinue
|
||||
Remove-Item '{ps_quote(remote_ps1_path)}' -Force -ErrorAction SilentlyContinue
|
||||
}}
|
||||
exit $code
|
||||
"""
|
||||
)
|
||||
|
||||
stdout = result.std_out.decode("utf-8", errors="ignore").strip()
|
||||
stderr = result.std_err.decode("utf-8", errors="ignore").strip()
|
||||
|
||||
if stdout:
|
||||
print(stdout)
|
||||
if stderr:
|
||||
print(stderr, file=sys.stderr)
|
||||
|
||||
return result.status_code
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
raise SystemExit(main())
|
||||
327
.github/scripts/remote_windows_deploy.ps1
vendored
Normal file
@@ -0,0 +1,327 @@
|
||||
$ErrorActionPreference = 'Stop'
|
||||
$ProgressPreference = 'SilentlyContinue'
|
||||
|
||||
function Write-Step {
|
||||
param([string]$Message)
|
||||
Write-Host "==> $Message"
|
||||
}
|
||||
|
||||
function Get-RequiredEnv {
|
||||
param([string]$Name)
|
||||
|
||||
$Value = [Environment]::GetEnvironmentVariable($Name)
|
||||
if ([string]::IsNullOrWhiteSpace($Value)) {
|
||||
throw "Missing required environment variable: $Name"
|
||||
}
|
||||
|
||||
return $Value
|
||||
}
|
||||
|
||||
function Get-OptionalEnv {
|
||||
param(
|
||||
[string]$Name,
|
||||
[string]$DefaultValue
|
||||
)
|
||||
|
||||
$Value = [Environment]::GetEnvironmentVariable($Name)
|
||||
if ([string]::IsNullOrWhiteSpace($Value)) {
|
||||
return $DefaultValue
|
||||
}
|
||||
|
||||
return $Value
|
||||
}
|
||||
|
||||
$DeployRoot = Get-OptionalEnv 'KK_DEPLOY_ROOT' 'C:\kkFileView-5.0'
|
||||
$HealthUrl = Get-OptionalEnv 'KK_DEPLOY_HEALTH_URL' 'http://127.0.0.1:8012/'
|
||||
$RepoUrl = Get-OptionalEnv 'KK_DEPLOY_REPO_URL' 'https://github.com/kekingcn/kkFileView.git'
|
||||
$Branch = Get-OptionalEnv 'KK_DEPLOY_BRANCH' 'master'
|
||||
$SourceRoot = Get-OptionalEnv 'KK_DEPLOY_SOURCE_ROOT' 'C:\kkFileView-source'
|
||||
$JavaHome = Get-OptionalEnv 'KK_DEPLOY_JAVA_HOME' 'C:\Program Files\jdk-21.0.2'
|
||||
$GitExe = Get-OptionalEnv 'KK_DEPLOY_GIT_EXE' 'C:\kkFileView-tools\git\cmd\git.exe'
|
||||
$MvnCmd = Get-OptionalEnv 'KK_DEPLOY_MVN_CMD' 'C:\kkFileView-tools\maven\bin\mvn.cmd'
|
||||
$MavenSettings = Get-OptionalEnv 'KK_DEPLOY_MAVEN_SETTINGS' ''
|
||||
$DryRun = Get-OptionalEnv 'KK_DEPLOY_DRY_RUN' 'false'
|
||||
|
||||
$BinDir = Join-Path $DeployRoot 'bin'
|
||||
$StartupScript = Join-Path $BinDir 'startup.bat'
|
||||
$ReleaseDir = Join-Path $DeployRoot 'releases'
|
||||
$DeployTmp = Join-Path $DeployRoot 'deploy-tmp'
|
||||
$BuildOutputDir = Join-Path (Join-Path $SourceRoot 'server') 'target'
|
||||
|
||||
if (-not (Test-Path $DeployRoot)) {
|
||||
throw "Deploy root not found: $DeployRoot"
|
||||
}
|
||||
|
||||
if (-not (Test-Path $BinDir)) {
|
||||
throw "Bin directory not found: $BinDir"
|
||||
}
|
||||
|
||||
if (-not (Test-Path $StartupScript)) {
|
||||
throw "Startup script not found: $StartupScript"
|
||||
}
|
||||
|
||||
$CurrentJar = Get-ChildItem $BinDir -Filter 'kkFileView-*.jar' | Sort-Object LastWriteTime -Descending | Select-Object -First 1
|
||||
if (-not $CurrentJar) {
|
||||
throw "No kkFileView jar found in $BinDir"
|
||||
}
|
||||
|
||||
$JavaExe = Join-Path $JavaHome 'bin\java.exe'
|
||||
if (-not (Test-Path $JavaExe)) {
|
||||
throw "JDK 21 java executable not found: $JavaExe"
|
||||
}
|
||||
|
||||
if (-not (Test-Path $GitExe)) {
|
||||
throw "Git executable not found: $GitExe"
|
||||
}
|
||||
|
||||
if (-not (Test-Path $MvnCmd)) {
|
||||
throw "Maven executable not found: $MvnCmd"
|
||||
}
|
||||
|
||||
if (-not [string]::IsNullOrWhiteSpace($MavenSettings) -and -not (Test-Path $MavenSettings)) {
|
||||
throw "Maven settings file not found: $MavenSettings"
|
||||
}
|
||||
|
||||
$JarName = $CurrentJar.Name
|
||||
$JarPath = $CurrentJar.FullName
|
||||
|
||||
Write-Step "Deploy root: $DeployRoot"
|
||||
Write-Step "Current jar: $JarPath"
|
||||
Write-Step "Startup script: $StartupScript"
|
||||
Write-Step "Health url: $HealthUrl"
|
||||
Write-Step "Source root: $SourceRoot"
|
||||
Write-Step "Branch: $Branch"
|
||||
Write-Step "Git exe: $GitExe"
|
||||
Write-Step "Maven cmd: $MvnCmd"
|
||||
Write-Step "Java home: $JavaHome"
|
||||
if (-not [string]::IsNullOrWhiteSpace($MavenSettings)) {
|
||||
Write-Step "Maven settings: $MavenSettings"
|
||||
}
|
||||
|
||||
function Invoke-External {
|
||||
param(
|
||||
[string]$FilePath,
|
||||
[string[]]$Arguments,
|
||||
[string]$WorkingDirectory = $null
|
||||
)
|
||||
|
||||
$previous = $null
|
||||
if ($WorkingDirectory) {
|
||||
$previous = Get-Location
|
||||
Set-Location $WorkingDirectory
|
||||
}
|
||||
|
||||
try {
|
||||
& $FilePath @Arguments
|
||||
if ($LASTEXITCODE -ne 0) {
|
||||
throw "Command failed ($LASTEXITCODE): $FilePath $($Arguments -join ' ')"
|
||||
}
|
||||
} finally {
|
||||
if ($previous) {
|
||||
Set-Location $previous
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function Assert-SafeSourceRoot {
|
||||
param([string]$PathToCheck)
|
||||
|
||||
$FullPath = [System.IO.Path]::GetFullPath($PathToCheck)
|
||||
$RootPath = [System.IO.Path]::GetPathRoot($FullPath)
|
||||
if ($FullPath.TrimEnd('\') -eq $RootPath.TrimEnd('\')) {
|
||||
throw "Refusing to use drive root as source root: $FullPath"
|
||||
}
|
||||
|
||||
$DangerousLeafNames = @(
|
||||
'Windows',
|
||||
'Users',
|
||||
'Program Files',
|
||||
'Program Files (x86)',
|
||||
'ProgramData'
|
||||
)
|
||||
$LeafName = Split-Path -Leaf $FullPath.TrimEnd('\')
|
||||
if ($DangerousLeafNames -contains $LeafName) {
|
||||
throw "Refusing to use a high-risk source root path: $FullPath"
|
||||
}
|
||||
}
|
||||
|
||||
$env:JAVA_HOME = $JavaHome
|
||||
$env:Path = (Join-Path $JavaHome 'bin') + ';' + (Split-Path -Parent $GitExe) + ';' + (Split-Path -Parent $MvnCmd) + ';' + $env:Path
|
||||
|
||||
Write-Step 'Validating Git executable'
|
||||
Invoke-External -FilePath $GitExe -Arguments @('--version')
|
||||
|
||||
Write-Step 'Validating Maven executable'
|
||||
$MavenVersionArgs = @('-version')
|
||||
if (-not [string]::IsNullOrWhiteSpace($MavenSettings)) {
|
||||
$MavenVersionArgs = @('-s', $MavenSettings, '-version')
|
||||
}
|
||||
Invoke-External -FilePath $MvnCmd -Arguments $MavenVersionArgs
|
||||
|
||||
if ($DryRun -eq 'true') {
|
||||
Write-Step "Dry run enabled, remote validation finished"
|
||||
return
|
||||
}
|
||||
|
||||
New-Item -ItemType Directory -Force -Path $ReleaseDir | Out-Null
|
||||
New-Item -ItemType Directory -Force -Path $DeployTmp | Out-Null
|
||||
|
||||
function Sync-Repository {
|
||||
Assert-SafeSourceRoot -PathToCheck $SourceRoot
|
||||
|
||||
if (-not (Test-Path (Join-Path $SourceRoot '.git'))) {
|
||||
if (Test-Path $SourceRoot) {
|
||||
Remove-Item $SourceRoot -Recurse -Force
|
||||
}
|
||||
|
||||
$parent = Split-Path -Parent $SourceRoot
|
||||
if ($parent) {
|
||||
New-Item -ItemType Directory -Force -Path $parent | Out-Null
|
||||
}
|
||||
|
||||
Write-Step "Cloning repository from $RepoUrl"
|
||||
Invoke-External -FilePath $GitExe -Arguments @('clone', '--depth', '1', '--branch', $Branch, '--single-branch', $RepoUrl, $SourceRoot)
|
||||
return
|
||||
}
|
||||
|
||||
Write-Step "Fetching latest branch state from origin/$Branch"
|
||||
Invoke-External -FilePath $GitExe -Arguments @('remote', 'set-url', 'origin', $RepoUrl) -WorkingDirectory $SourceRoot
|
||||
Invoke-External -FilePath $GitExe -Arguments @('fetch', '--prune', '--depth', '1', 'origin', $Branch) -WorkingDirectory $SourceRoot
|
||||
Invoke-External -FilePath $GitExe -Arguments @('checkout', '-B', $Branch, "origin/$Branch") -WorkingDirectory $SourceRoot
|
||||
Invoke-External -FilePath $GitExe -Arguments @('reset', '--hard', "origin/$Branch") -WorkingDirectory $SourceRoot
|
||||
Invoke-External -FilePath $GitExe -Arguments @('clean', '-fd') -WorkingDirectory $SourceRoot
|
||||
}
|
||||
|
||||
function Build-KkFileView {
|
||||
Write-Step 'Building kkFileView from source'
|
||||
$BuildArgs = @('-B', 'clean', 'package', '-Dmaven.test.skip=true', '--file', 'pom.xml')
|
||||
if (-not [string]::IsNullOrWhiteSpace($MavenSettings)) {
|
||||
$BuildArgs = @('-s', $MavenSettings) + $BuildArgs
|
||||
}
|
||||
Invoke-External -FilePath $MvnCmd -Arguments $BuildArgs -WorkingDirectory $SourceRoot
|
||||
}
|
||||
|
||||
Sync-Repository
|
||||
Build-KkFileView
|
||||
|
||||
$DownloadedJars = Get-ChildItem $BuildOutputDir -Filter 'kkFileView-*.jar' -File
|
||||
if (-not $DownloadedJars) {
|
||||
throw "No kkFileView jar found in build output: $BuildOutputDir"
|
||||
}
|
||||
|
||||
if ($DownloadedJars.Count -ne 1) {
|
||||
throw "Expected exactly one kkFileView jar in build output, found $($DownloadedJars.Count)"
|
||||
}
|
||||
|
||||
$DownloadedJar = $DownloadedJars[0]
|
||||
|
||||
$Timestamp = Get-Date -Format 'yyyyMMddHHmmss'
|
||||
$BackupJar = Join-Path $ReleaseDir ("{0}.{1}.bak" -f $JarName, $Timestamp)
|
||||
|
||||
function Stop-KkFileView {
|
||||
foreach ($Process in @(Get-KkFileViewJavaProcesses) + @(Get-KkFileViewLauncherProcesses)) {
|
||||
Write-Step "Stopping process $($Process.ProcessId)"
|
||||
Stop-Process -Id $Process.ProcessId -Force -ErrorAction SilentlyContinue
|
||||
}
|
||||
}
|
||||
|
||||
function Get-KkFileViewJavaProcesses {
|
||||
$JarPattern = [regex]::Escape($JarName)
|
||||
return Get-CimInstance Win32_Process | Where-Object {
|
||||
$_.Name -match '^java(\.exe)?$' -and $_.CommandLine -and $_.CommandLine -match $JarPattern
|
||||
}
|
||||
}
|
||||
|
||||
function Get-KkFileViewLauncherProcesses {
|
||||
$StartupPattern = [regex]::Escape([System.IO.Path]::GetFileName($StartupScript))
|
||||
return Get-CimInstance Win32_Process | Where-Object {
|
||||
$_.Name -ieq 'cmd.exe' -and $_.CommandLine -and $_.CommandLine -match $StartupPattern
|
||||
}
|
||||
}
|
||||
|
||||
function Wait-KkFileViewStopped {
|
||||
param([int]$TimeoutSeconds = 30)
|
||||
|
||||
for ($i = 0; $i -lt $TimeoutSeconds; $i++) {
|
||||
$JavaProcesses = @(Get-KkFileViewJavaProcesses)
|
||||
$CmdProcesses = @(Get-KkFileViewLauncherProcesses)
|
||||
if ((@($JavaProcesses).Count + @($CmdProcesses).Count) -eq 0) {
|
||||
return $true
|
||||
}
|
||||
|
||||
Start-Sleep -Seconds 1
|
||||
}
|
||||
|
||||
return $false
|
||||
}
|
||||
|
||||
function Start-KkFileView {
|
||||
Write-Step "Starting kkFileView"
|
||||
$CreateResult = Invoke-CimMethod -ClassName Win32_Process -MethodName Create -Arguments @{
|
||||
CommandLine = ('cmd.exe /c ""' + $StartupScript + '""')
|
||||
CurrentDirectory = $BinDir
|
||||
}
|
||||
|
||||
if ($CreateResult.ReturnValue -ne 0) {
|
||||
throw "Failed to start kkFileView launcher, Win32_Process.Create returned $($CreateResult.ReturnValue)"
|
||||
}
|
||||
|
||||
Write-Step "Launcher process created with pid $($CreateResult.ProcessId)"
|
||||
}
|
||||
|
||||
function Wait-Health {
|
||||
param([string]$Url)
|
||||
|
||||
$SuccessfulChecks = 0
|
||||
for ($i = 0; $i -lt 24; $i++) {
|
||||
Start-Sleep -Seconds 5
|
||||
try {
|
||||
$Response = Invoke-WebRequest -Uri $Url -UseBasicParsing -TimeoutSec 5
|
||||
if ($Response.StatusCode -eq 200 -and @(Get-KkFileViewJavaProcesses).Count -gt 0) {
|
||||
$SuccessfulChecks++
|
||||
} else {
|
||||
$SuccessfulChecks = 0
|
||||
}
|
||||
|
||||
if ($SuccessfulChecks -ge 3) {
|
||||
return $true
|
||||
}
|
||||
} catch {
|
||||
$SuccessfulChecks = 0
|
||||
Start-Sleep -Milliseconds 200
|
||||
}
|
||||
}
|
||||
|
||||
return $false
|
||||
}
|
||||
|
||||
Write-Step "Backing up current jar to $BackupJar"
|
||||
Copy-Item $JarPath $BackupJar -Force
|
||||
|
||||
Stop-KkFileView
|
||||
if (-not (Wait-KkFileViewStopped)) {
|
||||
throw "Timed out waiting for the previous kkFileView process to exit"
|
||||
}
|
||||
|
||||
Write-Step "Replacing jar with artifact output"
|
||||
Copy-Item $DownloadedJar.FullName $JarPath -Force
|
||||
|
||||
Start-KkFileView
|
||||
|
||||
if (-not (Wait-Health -Url $HealthUrl)) {
|
||||
Write-Step "Health check failed, rolling back"
|
||||
Stop-KkFileView
|
||||
if (-not (Wait-KkFileViewStopped)) {
|
||||
throw "Timed out waiting for the failed kkFileView process to exit during rollback"
|
||||
}
|
||||
Copy-Item $BackupJar $JarPath -Force
|
||||
Start-KkFileView
|
||||
|
||||
if (-not (Wait-Health -Url $HealthUrl)) {
|
||||
throw "Deployment failed and rollback health check also failed"
|
||||
}
|
||||
|
||||
throw "Deployment failed, rollback completed successfully"
|
||||
}
|
||||
|
||||
Write-Step "Deployment completed successfully"
|
||||
78
.github/workflows/auto-close-old-issues.yml
vendored
Normal file
@@ -0,0 +1,78 @@
|
||||
name: Auto Close Old Issues (1y)
|
||||
|
||||
on:
|
||||
schedule:
|
||||
# Daily at 02:20 UTC
|
||||
- cron: '20 2 * * *'
|
||||
workflow_dispatch:
|
||||
|
||||
permissions:
|
||||
issues: write
|
||||
|
||||
jobs:
|
||||
close_old_issues:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Close issues older than 1 year
|
||||
uses: actions/github-script@v7
|
||||
with:
|
||||
script: |
|
||||
const owner = context.repo.owner;
|
||||
const repo = context.repo.repo;
|
||||
const now = new Date();
|
||||
const cutoff = new Date(now.getTime() - 365 * 24 * 60 * 60 * 1000);
|
||||
|
||||
const closeComment = `该 Issue 已超过 1 年未活跃,为便于维护当前问题队列,先做关闭处理。\n\n如该问题在最新版本仍存在,欢迎直接 **Reopen** 本 Issue(或新建 Issue 并关联本单),并补充:\n1. 版本与部署方式\n2. 最小复现步骤\n3. 关键日志/截图(请脱敏)\n\n我们会优先跟进。`;
|
||||
|
||||
let page = 1;
|
||||
let processed = 0;
|
||||
while (true) {
|
||||
const { data: issues } = await github.rest.issues.listForRepo({
|
||||
owner,
|
||||
repo,
|
||||
state: 'open',
|
||||
per_page: 100,
|
||||
page,
|
||||
sort: 'created',
|
||||
direction: 'asc'
|
||||
});
|
||||
|
||||
if (!issues.length) break;
|
||||
|
||||
for (const issue of issues) {
|
||||
// skip pull requests
|
||||
if (issue.pull_request) continue;
|
||||
|
||||
const createdAt = new Date(issue.created_at);
|
||||
if (createdAt > cutoff) {
|
||||
// list is sorted asc by created time; remaining items are newer
|
||||
core.info('Reached issues newer than cutoff, stop scanning.');
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
await github.rest.issues.createComment({
|
||||
owner,
|
||||
repo,
|
||||
issue_number: issue.number,
|
||||
body: closeComment,
|
||||
});
|
||||
|
||||
await github.rest.issues.update({
|
||||
owner,
|
||||
repo,
|
||||
issue_number: issue.number,
|
||||
state: 'closed',
|
||||
});
|
||||
|
||||
processed += 1;
|
||||
core.info(`Closed #${issue.number}`);
|
||||
} catch (e) {
|
||||
core.warning(`Failed to close #${issue.number}: ${e.message}`);
|
||||
}
|
||||
}
|
||||
|
||||
page += 1;
|
||||
}
|
||||
|
||||
core.info(`Done. Closed ${processed} old issues.`);
|
||||
34
.github/workflows/copilot-issue-auto-comment.yml
vendored
Normal file
@@ -0,0 +1,34 @@
|
||||
name: Copilot Issue Auto Comment
|
||||
|
||||
on:
|
||||
issues:
|
||||
types: [opened]
|
||||
workflow_dispatch:
|
||||
|
||||
permissions:
|
||||
issues: write
|
||||
|
||||
jobs:
|
||||
copilot_auto_comment:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Ask Copilot to triage issue automatically
|
||||
uses: actions/github-script@v7
|
||||
with:
|
||||
script: |
|
||||
const issue = context.payload.issue;
|
||||
if (!issue) return;
|
||||
|
||||
const owner = context.repo.owner;
|
||||
const repo = context.repo.repo;
|
||||
|
||||
const body = `@Copilot 请自动分诊并直接给出可执行建议(无需人工先介入):\n\n- 先判断类型:Bug / Performance / Security / Question / Feature\n- 检查 Issue 信息是否完整(版本、部署方式、复现步骤、日志)\n- 若信息不完整:请直接按模板列出缺失项并引导补充\n- 若信息较完整:请给出下一步排查建议与最小复现建议\n- 若判断为已知问题或已修复:请给出对应版本/修复方向\n\nIssue #${issue.number}\n标题:${issue.title}\n链接:${issue.html_url}\n\n---\n\n补充说明 / Support Notice:\n- GitHub Issues 会持续跟进处理 / We will continue to follow up through GitHub Issues.\n- 如为线上紧急问题,可通过知识星球渠道加速处理 / For urgent production issues, you can use our Knowledge Planet channel for faster processing:\n https://wx.zsxq.com/group/48844125114258`;
|
||||
|
||||
await github.rest.issues.createComment({
|
||||
owner,
|
||||
repo,
|
||||
issue_number: issue.number,
|
||||
body,
|
||||
});
|
||||
|
||||
core.info(`Copilot prompt comment posted to #${issue.number}`);
|
||||
52
.github/workflows/master-auto-deploy.yml
vendored
Normal file
@@ -0,0 +1,52 @@
|
||||
name: Master Auto Deploy
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ master ]
|
||||
workflow_dispatch:
|
||||
|
||||
concurrency:
|
||||
group: master-auto-deploy-production
|
||||
cancel-in-progress: false
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
deploy-windows:
|
||||
runs-on: ubuntu-22.04
|
||||
env:
|
||||
KK_DEPLOY_HOST: ${{ secrets.KK_DEPLOY_HOST }}
|
||||
KK_DEPLOY_PORT: ${{ secrets.KK_DEPLOY_PORT }}
|
||||
KK_DEPLOY_USERNAME: ${{ secrets.KK_DEPLOY_USERNAME }}
|
||||
KK_DEPLOY_PASSWORD: ${{ secrets.KK_DEPLOY_PASSWORD }}
|
||||
KK_DEPLOY_ROOT: ${{ secrets.KK_DEPLOY_ROOT }}
|
||||
KK_DEPLOY_HEALTH_URL: ${{ secrets.KK_DEPLOY_HEALTH_URL }}
|
||||
KK_DEPLOY_REPO_URL: ${{ vars.KK_DEPLOY_REPO_URL }}
|
||||
KK_DEPLOY_BRANCH: ${{ vars.KK_DEPLOY_BRANCH }}
|
||||
KK_DEPLOY_SOURCE_ROOT: ${{ vars.KK_DEPLOY_SOURCE_ROOT }}
|
||||
KK_DEPLOY_JAVA_HOME: ${{ vars.KK_DEPLOY_JAVA_HOME }}
|
||||
KK_DEPLOY_GIT_EXE: ${{ vars.KK_DEPLOY_GIT_EXE }}
|
||||
KK_DEPLOY_MVN_CMD: ${{ vars.KK_DEPLOY_MVN_CMD }}
|
||||
KK_DEPLOY_MAVEN_SETTINGS: ${{ vars.KK_DEPLOY_MAVEN_SETTINGS }}
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Set up Python
|
||||
uses: actions/setup-python@v5
|
||||
with:
|
||||
python-version: '3.11'
|
||||
|
||||
- name: Install WinRM dependencies
|
||||
run: pip install pywinrm
|
||||
|
||||
- name: Validate deploy secrets
|
||||
run: |
|
||||
test -n "$KK_DEPLOY_HOST" || (echo "Missing secret: KK_DEPLOY_HOST" && exit 1)
|
||||
test -n "$KK_DEPLOY_USERNAME" || (echo "Missing secret: KK_DEPLOY_USERNAME" && exit 1)
|
||||
test -n "$KK_DEPLOY_PASSWORD" || (echo "Missing secret: KK_DEPLOY_PASSWORD" && exit 1)
|
||||
|
||||
- name: Deploy to Windows server
|
||||
run: python .github/scripts/deploy_windows_winrm.py
|
||||
42
.github/workflows/maven.yml
vendored
@@ -12,13 +12,41 @@ on:
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-22.04
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- name: Set up JDK 8
|
||||
uses: actions/setup-java@v2
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Set up JDK 21
|
||||
uses: actions/setup-java@v4
|
||||
with:
|
||||
java-version: '8'
|
||||
distribution: 'adopt'
|
||||
cache: maven
|
||||
java-version: '21'
|
||||
distribution: 'temurin' # 使用 Eclipse Temurin (AdoptOpenJDK 的继任者)
|
||||
cache: 'maven'
|
||||
|
||||
- name: Cache Maven packages
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: ~/.m2/repository
|
||||
key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
|
||||
restore-keys: |
|
||||
${{ runner.os }}-maven-
|
||||
|
||||
- name: Build with Maven
|
||||
run: mvn -B package --file pom.xml
|
||||
run: mvn -B package -Dmaven.test.skip=true --file pom.xml
|
||||
|
||||
- name: Upload Linux distribution package
|
||||
if: success()
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: kkfileview-linux
|
||||
path: server/target/*.tar.gz
|
||||
retention-days: 7
|
||||
|
||||
- name: Upload Windows distribution package
|
||||
if: success()
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: kkfileview-windows
|
||||
path: server/target/*.zip
|
||||
retention-days: 7
|
||||
|
||||
118
.github/workflows/nightly-e2e.yml
vendored
Normal file
@@ -0,0 +1,118 @@
|
||||
name: Nightly E2E Full
|
||||
|
||||
on:
|
||||
schedule:
|
||||
- cron: '30 18 * * *' # 02:30 Asia/Shanghai
|
||||
workflow_dispatch:
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
e2e-nightly:
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 50
|
||||
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Setup JDK 21
|
||||
uses: actions/setup-java@v4
|
||||
with:
|
||||
distribution: temurin
|
||||
java-version: '21'
|
||||
cache: maven
|
||||
|
||||
- name: Setup Node.js
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: '20'
|
||||
cache: 'npm'
|
||||
cache-dependency-path: tests/e2e/package-lock.json
|
||||
|
||||
- name: Setup Python 3.11
|
||||
uses: actions/setup-python@v5
|
||||
with:
|
||||
python-version: '3.11'
|
||||
|
||||
- name: Install LibreOffice + archive tools
|
||||
run: |
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y libreoffice zip p7zip-full
|
||||
|
||||
- name: Setup Python deps for office fixtures
|
||||
run: |
|
||||
python -m pip install --upgrade pip
|
||||
pip install -r tests/e2e/requirements.txt
|
||||
|
||||
- name: Build kkFileView
|
||||
run: mvn -q -pl server -DskipTests package
|
||||
|
||||
- name: Install E2E deps
|
||||
working-directory: tests/e2e
|
||||
run: |
|
||||
npm ci
|
||||
npx playwright install --with-deps chromium
|
||||
|
||||
- name: Start fixture server
|
||||
run: |
|
||||
cd tests/e2e/fixtures
|
||||
python3 -m http.server 18080 > /tmp/fixture-server.log 2>&1 &
|
||||
|
||||
- name: Start kkFileView
|
||||
run: |
|
||||
JAR_PATH=$(ls server/target/kkFileView-*.jar | head -n 1)
|
||||
nohup env KK_TRUST_HOST='*' KK_NOT_TRUST_HOST='10.*,172.16.*,192.168.*' java -jar "$JAR_PATH" > /tmp/kkfileview.log 2>&1 &
|
||||
|
||||
- name: Wait for services
|
||||
run: |
|
||||
fixture_ready=false
|
||||
for i in {1..60}; do
|
||||
if curl -fsS http://127.0.0.1:18080/sample.txt >/dev/null; then
|
||||
fixture_ready=true
|
||||
break
|
||||
fi
|
||||
sleep 1
|
||||
done
|
||||
if [ "$fixture_ready" != "true" ]; then
|
||||
echo "Error: fixture server did not become ready within 60 seconds." >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
kkfileview_ready=false
|
||||
for i in {1..120}; do
|
||||
if curl -fsS http://127.0.0.1:8012/ >/dev/null; then
|
||||
kkfileview_ready=true
|
||||
break
|
||||
fi
|
||||
sleep 1
|
||||
done
|
||||
if [ "$kkfileview_ready" != "true" ]; then
|
||||
echo "Error: kkFileView service did not become ready within 120 seconds." >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
- name: Run nightly E2E suites
|
||||
working-directory: tests/e2e
|
||||
env:
|
||||
KK_BASE_URL: http://127.0.0.1:8012
|
||||
FIXTURE_BASE_URL: http://127.0.0.1:18080
|
||||
E2E_MAX_PREVIEW_MS: 20000
|
||||
run: npm run test:ci
|
||||
|
||||
- name: Upload Playwright report
|
||||
if: always()
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: nightly-playwright-report
|
||||
path: tests/e2e/playwright-report
|
||||
|
||||
- name: Upload service logs
|
||||
if: always()
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: nightly-e2e-service-logs
|
||||
path: |
|
||||
/tmp/kkfileview.log
|
||||
/tmp/fixture-server.log
|
||||
100
.github/workflows/pr-e2e-mvp.yml
vendored
Normal file
@@ -0,0 +1,100 @@
|
||||
name: PR E2E MVP
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
branches: [master]
|
||||
workflow_dispatch:
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
e2e-mvp:
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 40
|
||||
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Setup JDK 21
|
||||
uses: actions/setup-java@v4
|
||||
with:
|
||||
distribution: temurin
|
||||
java-version: '21'
|
||||
cache: maven
|
||||
|
||||
- name: Setup Node.js
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: '20'
|
||||
cache: 'npm'
|
||||
cache-dependency-path: tests/e2e/package-lock.json
|
||||
|
||||
- name: Setup Python 3.11
|
||||
uses: actions/setup-python@v5
|
||||
with:
|
||||
python-version: '3.11'
|
||||
|
||||
- name: Install LibreOffice + archive tools
|
||||
run: |
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y libreoffice zip p7zip-full
|
||||
|
||||
- name: Setup Python deps for office fixtures
|
||||
run: |
|
||||
python -m pip install --upgrade pip
|
||||
pip install -r tests/e2e/requirements.txt
|
||||
|
||||
- name: Build kkFileView
|
||||
run: mvn -q -pl server -DskipTests package
|
||||
|
||||
- name: Install E2E deps
|
||||
working-directory: tests/e2e
|
||||
run: |
|
||||
npm install
|
||||
npx playwright install --with-deps chromium
|
||||
|
||||
- name: Start fixture server
|
||||
run: |
|
||||
cd tests/e2e/fixtures
|
||||
python3 -m http.server 18080 > /tmp/fixture-server.log 2>&1 &
|
||||
|
||||
- name: Start kkFileView
|
||||
run: |
|
||||
JAR_PATH=$(ls server/target/kkFileView-*.jar | head -n 1)
|
||||
nohup env KK_TRUST_HOST='*' KK_NOT_TRUST_HOST='10.*,172.16.*,192.168.*' java -jar "$JAR_PATH" > /tmp/kkfileview.log 2>&1 &
|
||||
|
||||
- name: Wait for services
|
||||
run: |
|
||||
for i in {1..60}; do
|
||||
curl -fsS http://127.0.0.1:18080/sample.txt >/dev/null && break
|
||||
sleep 1
|
||||
done
|
||||
for i in {1..120}; do
|
||||
curl -fsS http://127.0.0.1:8012/ >/dev/null && break
|
||||
sleep 1
|
||||
done
|
||||
|
||||
- name: Run E2E
|
||||
working-directory: tests/e2e
|
||||
env:
|
||||
KK_BASE_URL: http://127.0.0.1:8012
|
||||
FIXTURE_BASE_URL: http://127.0.0.1:18080
|
||||
run: npm test
|
||||
|
||||
- name: Upload Playwright report
|
||||
if: always()
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: playwright-report
|
||||
path: tests/e2e/playwright-report
|
||||
|
||||
- name: Upload service logs
|
||||
if: always()
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: e2e-service-logs
|
||||
path: |
|
||||
/tmp/kkfileview.log
|
||||
/tmp/fixture-server.log
|
||||
1
.gitignore
vendored
@@ -26,6 +26,7 @@ nbdist/
|
||||
### VS Code ###
|
||||
.vscode/
|
||||
.DS_Store
|
||||
.artifacts/
|
||||
|
||||
server/src/main/cache/
|
||||
server/src/main/file/
|
||||
|
||||
230
AGENTS.md
Normal file
@@ -0,0 +1,230 @@
|
||||
# AGENTS.md
|
||||
|
||||
This document is for coding agents and automation tools working in this repository.
|
||||
|
||||
## Project Overview
|
||||
|
||||
- Project: `kkFileView`
|
||||
- Stack: Spring Boot + Freemarker + Redis/Redisson (optional) + JODConverter + front-end preview pages
|
||||
- Main module: `server`
|
||||
- Default local URL: `http://127.0.0.1:8012/`
|
||||
- Production demo: `https://file.kkview.cn/`
|
||||
|
||||
This repository is a document preview service. Most user-facing work falls into one of these areas:
|
||||
|
||||
1. preview routing and file-type dispatch
|
||||
2. conversion pipelines for Office / PDF / CAD / archives / images
|
||||
3. Freemarker preview templates under `server/src/main/resources/web`
|
||||
4. CI, E2E fixtures, and production deployment automation
|
||||
|
||||
## Repository Layout
|
||||
|
||||
- `server/`
|
||||
Main application code, templates, config, packaged artifacts
|
||||
- `server/src/main/java/cn/keking/`
|
||||
Core Java application code
|
||||
- `server/src/main/resources/web/`
|
||||
Freemarker preview templates
|
||||
- `server/src/main/resources/static/`
|
||||
Front-end static assets used by preview pages
|
||||
- `server/src/main/config/`
|
||||
Main runtime config files
|
||||
- `server/src/main/bin/`
|
||||
Local startup/dev scripts
|
||||
- `tests/e2e/`
|
||||
Playwright-based end-to-end tests and fixtures
|
||||
- `.github/workflows/`
|
||||
CI and deployment workflows
|
||||
- `.github/scripts/`
|
||||
Windows production deployment scripts over WinRM
|
||||
|
||||
## Key Entry Points
|
||||
|
||||
- App entry:
|
||||
- `server/src/main/java/cn/keking/ServerMain.java`
|
||||
- Preview controller:
|
||||
- `server/src/main/java/cn/keking/web/controller/OnlinePreviewController.java`
|
||||
- File attribute parsing / request handling:
|
||||
- `server/src/main/java/cn/keking/service/FileHandlerService.java`
|
||||
- Office preview flow:
|
||||
- `server/src/main/java/cn/keking/service/impl/OfficeFilePreviewImpl.java`
|
||||
- PDF preview flow:
|
||||
- `server/src/main/java/cn/keking/service/impl/PdfFilePreviewImpl.java`
|
||||
- Archive extraction:
|
||||
- `server/src/main/java/cn/keking/service/CompressFileReader.java`
|
||||
|
||||
## Important Templates
|
||||
|
||||
- `server/src/main/resources/web/compress.ftl`
|
||||
Archive directory/tree preview page
|
||||
- `server/src/main/resources/web/pdf.ftl`
|
||||
PDF preview container page
|
||||
- `server/src/main/resources/web/picture.ftl`
|
||||
Single image preview page
|
||||
- `server/src/main/resources/web/officePicture.ftl`
|
||||
Office/PDF image-mode preview page
|
||||
- `server/src/main/resources/web/officeweb.ftl`
|
||||
Front-end xlsx/html preview page
|
||||
|
||||
When debugging UX issues, inspect the exact template selected by the preview flow first. Do not assume two similar preview pages share the same CSS or behavior.
|
||||
|
||||
## Local Development
|
||||
|
||||
### Recommended dev mode
|
||||
|
||||
Use:
|
||||
|
||||
```bash
|
||||
./server/src/main/bin/dev.sh
|
||||
```
|
||||
|
||||
This runs Spring Boot with resource hot reload using:
|
||||
|
||||
- `spring-boot:run`
|
||||
- `-Dspring-boot.run.addResources=true`
|
||||
- `server/src/main/config/application.properties`
|
||||
|
||||
For front-end template or CSS/JS edits, prefer `dev.sh` over rebuilding jars repeatedly.
|
||||
|
||||
### Jar build
|
||||
|
||||
```bash
|
||||
mvn -q -pl server -DskipTests package
|
||||
```
|
||||
|
||||
### Main test command used in CI
|
||||
|
||||
```bash
|
||||
mvn -B package -Dmaven.test.skip=true --file pom.xml
|
||||
```
|
||||
|
||||
## Configuration Notes
|
||||
|
||||
Primary runtime config used by the scripts and defaults committed in this repository:
|
||||
|
||||
- `server/src/main/config/application.properties`
|
||||
|
||||
Optional environment-specific config:
|
||||
|
||||
- `server/src/main/config/test.properties`
|
||||
|
||||
Be careful: the repository defaults point at `application.properties`. If a deployment environment explicitly starts the app with `test.properties`, treat that as an environment-specific override rather than the repository default. Always verify the actual startup command before assuming which config file is active.
|
||||
|
||||
Examples of config that commonly affects behavior:
|
||||
|
||||
- `office.preview.type`
|
||||
- `office.preview.switch.disabled`
|
||||
- `trust.host`
|
||||
- `not.trust.host`
|
||||
- `file.upload.disable`
|
||||
|
||||
## Preview Behavior Notes
|
||||
|
||||
- Office files can render in `pdf` mode or `image` mode.
|
||||
- PDF preview uses `pdf.ftl`.
|
||||
- Single images use `picture.ftl`.
|
||||
- Office image-mode previews use `officePicture.ftl`.
|
||||
- Archive previews are not simple file lists; they can load nested previews via the archive UI in `compress.ftl`.
|
||||
|
||||
When changing preview defaults, verify both:
|
||||
|
||||
1. server-side default config
|
||||
2. front-end mode-switch links/buttons
|
||||
|
||||
## Archive Preview Notes
|
||||
|
||||
Archive preview is a sensitive area because it combines:
|
||||
|
||||
- directory tree generation
|
||||
- extraction to disk
|
||||
- nested preview URL construction
|
||||
- inline iframe loading
|
||||
|
||||
If an archive-contained Office file gets stuck on loading:
|
||||
|
||||
1. verify the extracted file on disk is not corrupted
|
||||
2. verify conversion output exists
|
||||
3. verify the preview template points to the correct generated artifact
|
||||
4. verify the running Office manager / LibreOffice process is healthy
|
||||
|
||||
Do not assume “loading forever” is a front-end issue.
|
||||
|
||||
## Testing
|
||||
|
||||
### Targeted Java tests
|
||||
|
||||
Example targeted test:
|
||||
|
||||
```bash
|
||||
mvn -q -pl server -Dtest=PdfViewerCompatibilityTests test
|
||||
```
|
||||
|
||||
### E2E tests
|
||||
|
||||
See:
|
||||
|
||||
- `tests/e2e/README.md`
|
||||
|
||||
PR E2E currently covers:
|
||||
|
||||
- common preview smoke tests
|
||||
- Office smoke tests
|
||||
- archive smoke tests
|
||||
- basic security and performance checks
|
||||
|
||||
## CI / Deployment
|
||||
|
||||
### CI
|
||||
|
||||
- `maven.yml`
|
||||
- builds on `push` to `master`
|
||||
- builds on PRs targeting `master`
|
||||
- `pr-e2e-mvp.yml`
|
||||
- runs E2E on PRs to `master`
|
||||
|
||||
### Production deployment
|
||||
|
||||
- `master-auto-deploy.yml`
|
||||
- triggers on push to `master`
|
||||
- deploys to Windows over WinRM
|
||||
|
||||
Deployment script:
|
||||
|
||||
- `.github/scripts/remote_windows_deploy.ps1`
|
||||
|
||||
Important operational detail:
|
||||
|
||||
- the committed `bin/startup.bat` in this repo points at `..\config\application.properties`
|
||||
- if production uses a different config file, treat that as an out-of-repo server override rather than a repository default
|
||||
|
||||
If a production config change “does not take effect”, inspect the actual startup command or deployed `startup.bat` on the server first and verify which config file path it is using.
|
||||
|
||||
## Working Conventions For Agents
|
||||
|
||||
- Prefer minimal, targeted changes over wide refactors.
|
||||
- Inspect the active preview template before editing CSS.
|
||||
- Verify whether behavior is controlled by config, back-end routing, or front-end template logic before changing code.
|
||||
- For production/debug tasks, distinguish clearly between:
|
||||
- repository source defaults
|
||||
- deployed server config
|
||||
- runtime process arguments
|
||||
- When changing defaults, mention whether the change affects:
|
||||
- local dev only
|
||||
- repository default config
|
||||
- deployed server config
|
||||
- existing query-param overrides
|
||||
|
||||
## Suggested Validation Checklist
|
||||
|
||||
For preview-related changes, validate as many of these as apply:
|
||||
|
||||
1. target URL returns `200`
|
||||
2. selected template is the expected one
|
||||
3. generated intermediate artifacts exist when required
|
||||
4. target UI element or style change is actually present in rendered HTML
|
||||
5. targeted Java test passes
|
||||
6. relevant E2E path is still compatible
|
||||
|
||||
## Non-Goals
|
||||
|
||||
This file is not a replacement for user-facing product documentation. Keep it focused on helping coding agents navigate the codebase and make correct changes faster.
|
||||
@@ -1,5 +1,4 @@
|
||||
FROM keking/kkfileview-jdk:latest
|
||||
MAINTAINER chenjh "842761733@qq.com"
|
||||
FROM keking/kkfileview-base:5.0.0
|
||||
ADD server/target/kkFileView-*.tar.gz /opt/
|
||||
ENV KKFILEVIEW_BIN_FOLDER /opt/kkFileView-4.4.0-beta/bin
|
||||
ENTRYPOINT ["java","-Dfile.encoding=UTF-8","-Dspring.config.location=/opt/kkFileView-4.4.0-beta/config/application.properties","-jar","/opt/kkFileView-4.4.0-beta/bin/kkFileView-4.4.0-beta.jar"]
|
||||
ENV KKFILEVIEW_BIN_FOLDER=/opt/kkFileView-5.0.0/bin
|
||||
ENTRYPOINT ["java","-Dfile.encoding=UTF-8","-Dspring.config.location=/opt/kkFileView-5.0.0/config/application.properties","-jar","/opt/kkFileView-5.0.0/bin/kkFileView-5.0.0.jar"]
|
||||
|
||||
156
README.cn.md
@@ -1,6 +1,6 @@
|
||||
# kkFileView
|
||||
文档在线预览项目解决方案,项目使用流行的spring boot搭建,易上手和部署。万能的文件预览开源项目,基本支持主流文档格式预览,如:
|
||||
1. 支持 doc, docx, xls, xlsx, xlsm, ppt, pptx, csv, tsv, dotm, xlt, xltm, dot, dotx,xlam, xla ,pages 等 Office 办公文档
|
||||
1. 支持 doc, docx, xls, xlsx, xlsm, ppt, pptx, csv, tsv, dotm, xlt, xltm, dot, dotx,xlam, xla ,pages ,pptm 等 Office 办公文档
|
||||
2. 支持 wps, dps, et, ett, wpt 等国产 WPS Office 办公文档
|
||||
3. 支持 odt, ods, ots, odp, otp, six, ott, fodt, fods 等OpenOffice、LibreOffice 办公文档
|
||||
4. 支持 vsd, vsdx 等 Visio 流程图文件
|
||||
@@ -9,18 +9,18 @@
|
||||
7. 支持 pdf ,ofd, rtf 等文档
|
||||
8. 支持 xmind 软件模型文件
|
||||
9. 支持 bpmn 工作流文件
|
||||
10. 支持 eml 邮件文件
|
||||
10. 支持 eml, msg 邮件文件
|
||||
11. 支持 epub 图书文档
|
||||
12. 支持 obj, 3ds, stl, ply, gltf, glb, off, 3dm, fbx, dae, wrl, 3mf, ifc, brep, step, iges, fcstd, bim 等 3D 模型文件
|
||||
13. 支持 dwg, dxf, dwf, iges , igs, dwt, dng, ifc, dwfx, stl, cf2, plt 等 CAD 模型文件
|
||||
14. 支持 txt, xml(渲染), xbrl(渲染), md(渲染), java, php, py, js, css 等所有纯文本
|
||||
15. 支持 zip, rar, jar, tar, gzip, 7z 等压缩包
|
||||
16. 支持 jpg, jpeg, png, gif, bmp, ico, jfif, webp 等图片预览(翻转,缩放,镜像)
|
||||
16. 支持 jpg, jpeg, png, gif, bmp, ico, jfif, webp ,heic ,heif等图片预览(翻转,缩放,镜像)
|
||||
17. 支持 tif, tiff 图信息模型文件
|
||||
18. 支持 tga 图像格式文件
|
||||
19. 支持 svg 矢量图像格式文件
|
||||
20. 支持 mp3,wav,mp4,flv 等音视频格式文件
|
||||
21. 支持 avi,mov,rm,webm,ts,rm,mkv,mpeg,ogg,mpg,rmvb,wmv,3gp,ts,swf 等视频格式转码预览
|
||||
21. 支持 avi,mov,rm,webm,ts,rm,mkv,mpeg,ogg,mpg,rmvb,wmv,3gp,ts 等视频格式转码预览
|
||||
22. 支持 dcm 等医疗数位影像预览
|
||||
23. 支持 drawio 绘图预览
|
||||
|
||||
@@ -53,80 +53,81 @@
|
||||
#### 1. 文本预览
|
||||
支持所有类型的文本文档预览, 由于文本文档类型过多,无法全部枚举,默认开启的类型如下 txt,html,htm,asp,jsp,xml,xbrl,json,properties,md,gitignore,log,java,py,c,cpp,sql,sh,bat,m,bas,prg,cmd
|
||||
文本预览效果如下
|
||||

|
||||

|
||||
|
||||
#### 2. 图片预览
|
||||
支持jpg,jpeg,png,gif等图片预览(翻转,缩放,镜像),预览效果如下
|
||||

|
||||

|
||||
|
||||
#### 3. word文档预览
|
||||
支持doc,docx文档预览,word预览有两种模式:一种是每页word转为图片预览,另一种是整个word文档转成pdf,再预览pdf。两种模式的适用场景如下
|
||||
* 图片预览:word文件大,前台加载整个pdf过慢
|
||||
* pdf预览:内网访问,加载pdf快
|
||||
图片预览模式预览效果如下
|
||||

|
||||

|
||||
pdf预览模式预览效果如下
|
||||

|
||||

|
||||
|
||||
#### 4. ppt文档预览
|
||||
支持ppt,pptx文档预览,和word文档一样,有两种预览模式
|
||||
图片预览模式预览效果如下
|
||||

|
||||

|
||||
pdf预览模式预览效果如下
|
||||

|
||||

|
||||
|
||||
#### 5. pdf文档预览
|
||||
支持pdf文档预览,和word文档一样,有两种预览模式
|
||||
图片预览模式预览效果如下
|
||||

|
||||

|
||||
pdf预览模式预览效果如下
|
||||

|
||||

|
||||
|
||||
#### 6. excel文档预览
|
||||
支持xls,xlsx文档预览,预览效果如下
|
||||

|
||||

|
||||
|
||||
#### 7. 压缩文件预览
|
||||
支持zip,rar,jar,tar,gzip等压缩包,预览效果如下
|
||||

|
||||

|
||||
可点击压缩包中的文件名,直接预览文件,预览效果如下
|
||||

|
||||

|
||||
|
||||
#### 8. 多媒体文件预览
|
||||
理论上支持所有的视频、音频文件,由于无法枚举所有文件格式,默认开启的类型如下
|
||||
mp3,wav,mp4,flv
|
||||
视频预览效果如下
|
||||

|
||||

|
||||
音频预览效果如下
|
||||

|
||||

|
||||
|
||||
#### 9. CAD文档预览
|
||||
支持CAD dwg文档预览,和word文档一样,有两种预览模式
|
||||
图片预览模式预览效果如下
|
||||

|
||||

|
||||
pdf预览模式预览效果如下
|
||||

|
||||
考虑说明篇幅原因,就不贴其他格式文件的预览效果了,感兴趣的可以参考下面的实例搭建下
|
||||

|
||||
|
||||
#### 10. Excel文件纯前端渲染效果
|
||||
|
||||

|
||||

|
||||
|
||||
#### 11. 流程图bpmn文件预览效果
|
||||
|
||||

|
||||

|
||||
|
||||
#### 12. 3D模型文件预览效果:
|
||||
|
||||

|
||||

|
||||
|
||||
#### 13. dcm医疗数位影像文件预览效果:
|
||||
|
||||

|
||||

|
||||
|
||||
#### 14. drawio流程图预览效果:
|
||||
|
||||

|
||||

|
||||
|
||||
考虑说明篇幅原因,就不贴其他格式文件的预览效果了,感兴趣的可以参考下面的实例搭建下
|
||||
|
||||
### 快速开始
|
||||
> 项目使用技术
|
||||
@@ -148,7 +149,109 @@ pdf预览模式预览效果如下
|
||||
|
||||
### 历史更新记录
|
||||
|
||||
#### > 2023年07月05日,v4.3 版本发布 :
|
||||
#### > 2026年04月14日,v5.0.0 版本发布 :
|
||||
#### 优化内容
|
||||
1. xlsx 前端解析优化 - 提升Excel文件前端渲染性能
|
||||
2. 图片解析优化 - 改进图片处理机制
|
||||
3. tif 解析优化 - 增强TIF格式支持
|
||||
4. svg 解析优化 - 优化SVG矢量图渲染
|
||||
5. json 解析优化 - 改进JSON文件处理
|
||||
6. ftp多客户端接入优化 - 提升FTP服务兼容性
|
||||
7. 首页目录访问优化 - 采用post服务端分页机制
|
||||
8. marked 解析优化 - 改进Markdown渲染
|
||||
9. 压缩包预览页重构为单工作区布局,支持目录折叠与右侧内嵌预览
|
||||
10. 优化压缩包内文件类型标识,以及单图预览页的展示样式
|
||||
11. 补充面向工程自动化与编码代理的仓库说明文档
|
||||
12. 重构演示门户页面,包括首页、接入说明、版本记录与赞助页
|
||||
|
||||
#### 新增功能
|
||||
1. msg邮件解析 - 新增msg格式邮件文件预览支持
|
||||
2. heic图片解析 - 新增HEIC格式图片预览支持
|
||||
3. 跨域方法 - 新增跨域处理机制
|
||||
4. 高亮方法 - 新增文本高亮功能
|
||||
5. 页码方法 - 新增文档页码控制
|
||||
6. AES加密方法 - 新增AES加密支持
|
||||
7. Basic鉴权方法 - 新增Basic认证机制
|
||||
8. 秘钥方法 - 新增密钥管理功能
|
||||
9. 防重复转换 - 新增重复文件转换防护
|
||||
10. 异步等待 - 新增异步处理机制
|
||||
11. 上传限制 - 新增不支持文件上传限制
|
||||
12. cadviewer转换方法 - 新增CAD查看器转换功能
|
||||
|
||||
#### 修复问题
|
||||
1. 压缩包路径问题 - 修复压缩包内部路径处理
|
||||
2. 安全问题 - 修复安全漏洞
|
||||
3. 图片水印不全问题 - 修复水印显示不完整
|
||||
4. SSL自签证书接入问题 - 修复自签名证书兼容性
|
||||
5. 修复压缩包内 Office 文件在重复解压后被追加写坏,导致一直卡在加载中的问题
|
||||
6. Office 默认预览改为 PDF 模式,且 PDF 预览默认打开缩略图侧栏
|
||||
7. 启动脚本改为自动发现当前发布包中的 jar,移除过时的硬编码 jar 名称
|
||||
8. 更新 Docker 与发布辅助文档,使其与 5.0.0 发布线保持一致
|
||||
9. 修复 OFD 表格竖线溢出导致的渲染异常
|
||||
10. 修复 PDF.js 兼容性补丁,避免兼容环境下的预览报错
|
||||
|
||||
#### 更新内容
|
||||
1. JDK版本要求 - 强制要求JDK 21及以上版本
|
||||
2. pdf前端解析更新 - 升级PDF前端渲染组件
|
||||
3. odf前端解析更新 - 升级ODF文档前端渲染
|
||||
4. 3D模型前端解析更新 - 升级3D模型查看器
|
||||
5. pdf后端异步转换优化 - 实现多线程异步转换
|
||||
6. tif后端异步转换优化 - 实现多线程异步转换
|
||||
7. 视频后端异步转换优化 - 实现多线程异步转换
|
||||
8. CAD后端异步转换优化 - 实现多线程异步转换
|
||||
9. 默认预览配置策略调整 - Office 预览默认切换为 PDF 模式,默认隐藏图片/PDF 模式切换按钮,且 PDF 预览默认展开缩略图侧栏。若升级后仍需保持旧的图片优先体验,请显式设置 `office.preview.type=image` 和 `office.preview.switch.disabled=false`。
|
||||
10. 信任域名配置匹配策略扩展 - `trust.host` 及相关规则现已支持通配符和 CIDR 匹配,升级后如果你依赖域名/IP 模式匹配,需要重新检查白名单和黑名单的实际生效范围
|
||||
|
||||
#### > 2025年01月16日,v4.4.0 版本发布 :
|
||||
|
||||
### 新增功能
|
||||
1. xlsx 新增支持打印功能
|
||||
2. 配置文件新增启用 GZIP 压缩
|
||||
3. CAD 格式新增支持转换成 SVG 和 TIF 格式,新增超时结束、线程管理
|
||||
4. 新增删除文件使用验证码校验
|
||||
5. 新增 xbrl 格式预览支持
|
||||
6. PDF 预览新增控制签名、绘图、插图控制、搜索定位页码、定义显示内容等功能
|
||||
7. 新增 CSV 格式前端解析支持
|
||||
8. 新增 ARM64 下的 Docker 镜像支持
|
||||
9. 新增 Office 预览支持转换超时属性设置功能
|
||||
10. 新增预览文件 host 黑名单机制
|
||||
|
||||
### 优化
|
||||
1. 优化 OFD 移动端预览 页面不自适应
|
||||
2. 更新 xlsx 前端解析组件,加速解析速度
|
||||
3. 升级 CAD 组件
|
||||
4. office 功能调整,支持批注、转换页码限制、生成水印等功能
|
||||
5. 升级 markdown 组件
|
||||
6. 升级 dcm 解析组件
|
||||
7. 升级 PDF.JS 解析组件
|
||||
8. 更换视频播放插件为 ckplayer
|
||||
9. tif 解析更加智能化,支持被修改的图片格式
|
||||
10. 针对大小文本文件检测字符编码的正确率,处理并发隐患
|
||||
11. 重构下载文件的代码,新增通用的文件服务器认证访问的设计
|
||||
12. 更新 bootstrap 组件,并精简掉不需要的文件
|
||||
13. 更新 epub 版本,优化 epub 显示效果
|
||||
14. 解决定时清除缓存时,对于多媒体类型文件,只删除了磁盘缓存文件
|
||||
15. 自动检测已安装 Office 组件,增加 LibreOffice 7.5 & 7.6 版本默认路径
|
||||
16. 修改 drawio 默认为预览模式
|
||||
17. 新增 PDF 线程管理、超时管理、内存缓存管理,更新 PDF 解析组件版本
|
||||
18. 优化 Dockerfile,支持真正的跨平台构建镜像
|
||||
|
||||
### 修复
|
||||
1. 修复 forceUpdatedCache 属性设置,但本地缓存文件不更新的问题
|
||||
2. 修复 PDF 解密加密文件转换成功后后台报错的问题
|
||||
3. 修复 BPMN 不支持跨域的问题
|
||||
4. 修复压缩包二级反代特殊符号错误问题
|
||||
5. 修复视频跨域配置导致视频无法预览的问题
|
||||
6. 修复 TXT 文本类分页二次加载问题
|
||||
7. 修复 Drawio 缺少 Base64 组件的问题
|
||||
8. 修复 Markdown 被转义问题
|
||||
9. 修复 EPUB 跨域报错问题
|
||||
10. 修复 URL 特殊符号问题
|
||||
11. 修复压缩包穿越漏洞
|
||||
12. 修复压缩获取路径错误、图片合集路径错误、水印问题等 BUG
|
||||
13. 修复前端解析 XLSX 包含 EMF 格式文件错误问题
|
||||
|
||||
#### > 2023年07月05日,v4.3.0 版本发布 :
|
||||
|
||||
#### 新增功能:
|
||||
1. 新增dcm等医疗数位影像预
|
||||
@@ -377,4 +480,3 @@ dcm医疗数位影像 引用于 [dcmjs](https://github.com/dcmjs-org/dcmjs )开
|
||||
- 本项目诞生于[凯京集团],在取得公司高层同意后以 Apache 协议开源出来反哺社区,在此特别感谢凯京集团,以及集团领导[@唐老大](https://github.com/tangshd)的支持、@端木详笑的贡献。
|
||||
- 本项目已脱离公司由[KK开源社区]维护发展壮大,感谢所有给 kkFileView 提 Issue 、Pr 开发者
|
||||
- 本项目引入的第三方组件已在 '关于引用' 列表列出,感谢这些项目,让 kkFileView 更出色
|
||||
|
||||
|
||||
186
README.md
@@ -4,7 +4,7 @@
|
||||
|
||||
Document online preview project solution, built using the popular Spring Boot framework for easy setup and deployment. This versatile open source project provides basic support for a wide range of document formats, including:
|
||||
|
||||
1. Supports Office documents such as `doc`, `docx`, `xls`, `xlsx`, `xlsm`, `ppt`, `pptx`, `csv`, `tsv`, , `dotm`, `xlt`, `xltm`, `dot`, `xlam`, `dotx`, `xla,` ,`pages` etc.
|
||||
1. Supports Office documents such as `doc`, `docx`, `xls`, `xlsx`, `xlsm`, `ppt`, `pptx`, `csv`, `tsv`, , `dotm`, `xlt`, `xltm`, `dot`, `xlam`, `dotx`, `xla,` ,`pages` ,`pptm` etc.
|
||||
2. Supports domestic WPS Office documents such as `wps`, `dps`, `et` , `ett`, ` wpt`.
|
||||
3. Supports OpenOffice, LibreOffice office documents such as `odt`, `ods`, `ots`, `odp`, `otp`, `six`, `ott`, `fodt` and `fods`.
|
||||
4. Supports Visio flowchart files such as `vsd`, `vsdx`.
|
||||
@@ -13,13 +13,13 @@ Document online preview project solution, built using the popular Spring Boot fr
|
||||
7. Supports document formats like `pdf`, `ofd`, and `rtf`.
|
||||
8. Supports software model files like `xmind`.
|
||||
9. Support for `bpmn` workflow files.
|
||||
10. Support for `eml` mail files
|
||||
10. Support for `eml` , `msg` mail files
|
||||
11. Support for `epub` book documents
|
||||
12. Supports 3D model files like `obj`, `3ds`, `stl`, `ply`, `gltf`, `glb`, `off`, `3dm`, `fbx`, `dae`, `wrl`, `3mf`, `ifc`, `brep`, `step`, `iges`, `fcstd`, `bim`, etc.
|
||||
13. Supports CAD model files such as `dwg`, `dxf`, `dwf` `iges` ,` igs`, `dwt` , `dng` , `ifc` , `dwfx` , `stl` , `cf2` , `plt`, etc.
|
||||
14. Supports all plain text files such as `txt`, `xml` (rendering), `md` (rendering), `java`, `php`, `py`, `js`, `css`, etc.
|
||||
15. Supports compressed packages such as `zip`, `rar`, `jar`, `tar`, `gzip`, `7z`, etc.
|
||||
16. Supports image previewing (flip, zoom, mirror) of `jpg`, `jpeg`, `png`, `gif`, `bmp`, `ico`, `jfif`, `webp`, etc.
|
||||
16. Supports image previewing (flip, zoom, mirror) of `jpg`, `jpeg`, `png`, `gif`, `bmp`, `ico`, `jfif`, `webp`, `heic`, ,`heif` etc.
|
||||
17. Supports image information model files such as `tif` and `tiff`.
|
||||
18. Supports image format files such as `tga`.
|
||||
19. Supports vector image format files such as `svg`.
|
||||
@@ -63,6 +63,186 @@ URL:[https://file.kkview.cn](https://file.kkview.cn)
|
||||
|
||||
2. second step:Run the main method of `/server/src/main/java/cn/keking/ServerMain.java`. After starting,visit `http://localhost:8012/`.
|
||||
|
||||
## Change History
|
||||
|
||||
### Version 5.0.0 (April 14, 2026)
|
||||
|
||||
#### Improvements
|
||||
1. Enhanced xlsx front-end parsing - Improved Excel file front-end rendering performance
|
||||
2. Optimized image parsing - Enhanced image processing mechanism
|
||||
3. Improved tif parsing - Enhanced TIF format support
|
||||
4. Enhanced svg parsing - Optimized SVG vector image rendering
|
||||
5. Improved json parsing - Enhanced JSON file processing
|
||||
6. Optimized ftp multi-client access - Improved FTP service compatibility
|
||||
7. Enhanced home page directory access - Implemented post server-side pagination mechanism
|
||||
8. Improved marked parsing - Enhanced Markdown rendering
|
||||
9. Redesigned archive preview into a single workspace with a collapsible tree and inline file preview
|
||||
10. Improved archive preview file-type badges and single-image preview styling
|
||||
11. Added an agent-focused repository guide for engineering automation and maintenance
|
||||
12. Refreshed the demo portal pages, including the index, integration guide, release record, and sponsor pages
|
||||
|
||||
#### New Features
|
||||
1. msg email parsing - Added support for msg format email file preview
|
||||
2. heic image parsing - Added support for HEIC format image preview
|
||||
3. Cross-domain methods - Added cross-domain processing mechanism
|
||||
4. Highlighting methods - Added text highlighting functionality
|
||||
5. Pagination methods - Added document page control
|
||||
6. AES encryption methods - Added AES encryption support
|
||||
7. Basic authentication methods - Added Basic authentication mechanism
|
||||
8. Key management methods - Added key management functionality
|
||||
9. Anti-duplicate conversion - Added duplicate file conversion protection
|
||||
10. Async waiting - Added asynchronous processing mechanism
|
||||
11. Upload restrictions - Added restrictions for unsupported file uploads
|
||||
12. cadviewer conversion methods - Added CAD viewer conversion functionality
|
||||
|
||||
#### Fixed Issues
|
||||
1. Compressed file path issues - Fixed internal path handling in compressed files
|
||||
2. Security issues - Fixed security vulnerabilities
|
||||
3. Incomplete image watermark issues - Fixed incomplete watermark display
|
||||
4. SSL self-signed certificate access issues - Fixed compatibility with self-signed certificates
|
||||
5. Fixed archive-contained Office files that could stay stuck on loading because repeated extraction appended to existing files
|
||||
6. Default Office preview now prefers PDF mode, and PDF preview opens with the thumbnail sidebar visible by default
|
||||
7. Updated startup scripts to discover the packaged jar dynamically instead of relying on stale hard-coded jar names
|
||||
8. Updated Docker and release helper docs to align with the 5.0.0 release line
|
||||
9. Fixed OFD table border overflow rendering issues
|
||||
10. Refined the PDF.js compatibility polyfill to avoid preview errors in compatibility environments
|
||||
|
||||
#### Updates
|
||||
1. JDK version requirement - Mandatory requirement for JDK 21 or higher
|
||||
2. pdf front-end parsing update - Upgraded PDF front-end rendering component
|
||||
3. odf front-end parsing update - Upgraded ODF document front-end rendering
|
||||
4. 3D model front-end parsing update - Upgraded 3D model viewer
|
||||
5. pdf backend async conversion optimization - Implemented multi-threaded asynchronous conversion
|
||||
6. tif backend async conversion optimization - Implemented multi-threaded asynchronous conversion
|
||||
7. Video backend async conversion optimization - Implemented multi-threaded asynchronous conversion
|
||||
8. CAD backend async conversion optimization - Implemented multi-threaded asynchronous conversion
|
||||
9. Default preview configuration strategy adjusted - Office preview now defaults to PDF mode, the mode switch is hidden by default, and PDF preview opens with the thumbnail sidebar visible. If you need the previous image-first behavior after upgrade, explicitly set `office.preview.type=image` and `office.preview.switch.disabled=false`.
|
||||
10. Trust host configuration matching expanded - `trust.host` and related rules now support wildcard and CIDR matching, which may broaden or narrow effective allow/deny behavior after upgrade depending on your patterns
|
||||
|
||||
### Version 4.4.0 (January 16, 2025)
|
||||
|
||||
#### New Features
|
||||
1. xlsx printing support
|
||||
2. Added GZIP compression enablement in configuration
|
||||
3. CAD format now supports conversion to SVG and TIF formats, added timeout termination and thread management
|
||||
4. Added captcha verification for file deletion
|
||||
5. Added xbrl format preview support
|
||||
6. PDF preview added control over signatures, drawings, illustration control, search positioning pagination, and display content definition
|
||||
7. Added CSV format front-end parsing support
|
||||
8. Added Docker image support for ARM64
|
||||
9. Added Office preview conversion timeout property setting
|
||||
10. Added preview file host blacklist mechanism
|
||||
|
||||
#### Optimizations
|
||||
1. Optimized OFD mobile preview page adaptability
|
||||
2. Updated xlsx front-end parsing component to accelerate parsing speed
|
||||
3. Upgraded CAD component
|
||||
4. Office function adjustments, supporting comments, conversion page limit, watermark generation, etc.
|
||||
5. Upgraded markdown component
|
||||
6. Upgraded dcm parsing component
|
||||
7. Upgraded PDF.JS parsing component
|
||||
8. Changed video player plugin to ckplayer
|
||||
9. Smarter tif parsing, supporting modified image formats
|
||||
10. Improved character encoding detection accuracy for large and small text files, handling concurrency vulnerabilities
|
||||
11. Refactored file download code, added general file server authentication access design
|
||||
12. Updated bootstrap component and streamlined unnecessary files
|
||||
13. Updated epub version, optimized epub display effect
|
||||
14. Fixed issue where scheduled cache cleanup only deleted disk cache files for multimedia file types
|
||||
15. Auto-detection of installed Office components, added default paths for LibreOffice 7.5 & 7.6 versions
|
||||
16. Changed drawio default to preview mode
|
||||
17. Added PDF thread management, timeout management, memory cache management, updated PDF parsing component version
|
||||
18. Optimized Dockerfile for true cross-platform image building
|
||||
|
||||
#### Fixes
|
||||
1. Fixed forceUpdatedCache property setting issue where local cache files weren't updated
|
||||
2. Fixed PDF decryption error after successful encrypted file conversion
|
||||
3. Fixed BPMN cross-domain support issue
|
||||
4. Fixed special character error in compressed package secondary reverse proxy
|
||||
5. Fixed video cross-domain configuration causing video preview failure
|
||||
6. Fixed TXT text pagination secondary loading issue
|
||||
7. Fixed Drawio missing Base64 component issue
|
||||
8. Fixed Markdown escaping issue
|
||||
9. Fixed EPUB cross-domain error
|
||||
10. Fixed URL special character issues
|
||||
11. Fixed compressed package traversal vulnerability
|
||||
12. Fixed compressed file path errors, image collection path errors, watermark issues, etc.
|
||||
13. Fixed front-end parsing XLSX containing EMF format file errors
|
||||
|
||||
### Version 4.3.0 (July 5, 2023)
|
||||
|
||||
#### New Features
|
||||
1. Added DCM medical digital imaging preview
|
||||
2. Added drawio drawing preview
|
||||
3. Added command to regenerate with cache enabled: &forceUpdatedCache=true
|
||||
4. Added dwg CAD file preview
|
||||
5. Added PDF file password support
|
||||
6. Added DPI customization for PDF file image generation
|
||||
7. Added configuration to delete converted OFFICE, CAD, TIFF, compressed package source files (enabled by default to save disk space)
|
||||
8. Added front-end xlsx parsing method
|
||||
9. Added support for pages, eps, iges, igs, dwt, dng, ifc, dwfx, stl, cf2, plt and other formats
|
||||
|
||||
#### Optimizations
|
||||
1. Modified generated PDF file names to include file extensions to prevent duplicate names
|
||||
2. Adjusted SQL file preview method
|
||||
3. Optimized OFD preview compatibility
|
||||
4. Beautified TXT text pagination box display
|
||||
5. Upgraded Linux/Docker built-in office to LibreOffice-7.5.3
|
||||
6. Upgraded Windows built-in office to LibreOffice-7.5.3 Portable
|
||||
7. Other functional optimizations
|
||||
|
||||
#### Fixes
|
||||
1. Fixed compressed package path errors in reverse proxy scenarios
|
||||
2. Fixed .click error when image preview URLs contain &
|
||||
3. Fixed known OFD preview issues
|
||||
4. Fixed page error when clicking on file directories (tree nodes) in compressed package preview
|
||||
5. Other known issue fixes
|
||||
|
||||
### Version 4.2.1 (April 18, 2023)
|
||||
|
||||
#### Change Log
|
||||
1. Fixed null pointer bug in dwg file preview
|
||||
|
||||
### Version 4.2.0 (April 13, 2023)
|
||||
|
||||
#### New Features
|
||||
1. Added SVG format file preview support
|
||||
2. Added encrypted Office file preview support
|
||||
3. Added encrypted zip, rar, and other compressed package file preview support
|
||||
4. Added xmind software model file preview support
|
||||
5. Added BPMN workflow model file preview support
|
||||
6. Added eml email file preview support
|
||||
7. Added EPUB e-book file preview support
|
||||
8. Added office document format support: dotm, ett, xlt, xltm, wpt, dot, xlam, xla, dotx, etc.
|
||||
9. Added 3D model file support: obj, 3ds, stl, ply, gltf, glb, off, 3dm, fbx, dae, wrl, 3mf, ifc, brep, step, iges, fcstd, bim, etc.
|
||||
10. Added configurable high-risk file upload restrictions (e.g., exe files)
|
||||
11. Added configurable site filing information
|
||||
12. Added password requirement for demo site file deletion
|
||||
|
||||
#### Optimizations
|
||||
1. Added caching for text document preview
|
||||
2. Beautified 404, 500 error pages
|
||||
3. Optimized invoice and other OFD file preview seal rendering compatibility
|
||||
4. Removed office-plugin module, using new jodconverter component
|
||||
5. Optimized Excel file preview effect
|
||||
6. Optimized CAD file preview effect
|
||||
7. Updated xstream, junrar, pdfbox, and other dependency versions
|
||||
8. Updated TIF to PDF conversion plugin, added conversion cache
|
||||
9. Optimized demo page UI deployment
|
||||
10. Compressed package file preview supports directories
|
||||
|
||||
#### Fixes
|
||||
1. Fixed XSS issues in some interfaces
|
||||
2. Fixed console printed demo address not following content-path configuration
|
||||
3. Fixed OFD file preview cross-domain issues
|
||||
4. Fixed internal self-signed certificate HTTPS URL file download issues
|
||||
5. Fixed special character file deletion issues
|
||||
6. Fixed OOM caused by unreclaimed memory in PDF to image conversion
|
||||
7. Fixed garbled preview for xlsx 7.4+ version files
|
||||
8. Fixed TrustHostFilter not intercepting cross-domain interfaces (security issue - upgrade required if using TrustHost)
|
||||
9. Fixed compressed package file preview filename garbled issue on Linux systems
|
||||
10. Fixed OFD file preview only displaying 10 pages
|
||||
|
||||
|
||||
### Changelog
|
||||
> December 14, 2022, version 4.1.0 released:
|
||||
|
||||
|
||||
174
SECURITY_CONFIG.md
Normal file
@@ -0,0 +1,174 @@
|
||||
# kkFileView 安全配置指南
|
||||
|
||||
## ⚠️ 重要安全更新
|
||||
|
||||
从 4.4.0 之后版本开始,kkFileView 增强了安全性,默认拒绝所有未配置的外部文件预览请求,以防止 SSRF(服务器端请求伪造)攻击。
|
||||
|
||||
## 🔒 安全配置说明
|
||||
|
||||
### 1. 信任主机白名单配置(推荐)
|
||||
|
||||
在 `application.properties` 中配置允许预览的域名:
|
||||
|
||||
```properties
|
||||
# 方式1:通过配置文件
|
||||
trust.host = kkview.cn,yourdomain.com,cdn.example.com
|
||||
|
||||
# 方式2:通过环境变量
|
||||
KK_TRUST_HOST=kkview.cn,yourdomain.com,cdn.example.com
|
||||
```
|
||||
|
||||
**示例场景**:
|
||||
- 只允许预览来自 `oss.aliyuncs.com` 和 `cdn.example.com` 的文件
|
||||
```properties
|
||||
trust.host = oss.aliyuncs.com,cdn.example.com
|
||||
```
|
||||
|
||||
### 2. 允许所有主机(不推荐,仅测试环境)
|
||||
|
||||
```properties
|
||||
trust.host = *
|
||||
```
|
||||
|
||||
⚠️ **警告**:此配置会允许访问任意外部地址,存在安全风险,仅应在测试环境使用!
|
||||
|
||||
### 3. 黑名单配置(高级)
|
||||
|
||||
禁止特定域名或内网地址:
|
||||
|
||||
```properties
|
||||
# 禁止访问内网地址(强烈推荐)
|
||||
not.trust.host = localhost,127.0.0.1,192.168.*,10.*,172.16.*,169.254.*
|
||||
|
||||
# 禁止特定恶意域名
|
||||
not.trust.host = malicious-site.com,spam-domain.net
|
||||
```
|
||||
|
||||
**优先级**:黑名单 > 白名单
|
||||
|
||||
### 4. Docker 环境配置
|
||||
|
||||
```bash
|
||||
docker run -d \
|
||||
-e KK_TRUST_HOST=yourdomain.com,cdn.example.com \
|
||||
-e KK_NOT_TRUST_HOST=localhost,127.0.0.1 \
|
||||
-p 8012:8012 \
|
||||
keking/kkfileview:4.4.0
|
||||
```
|
||||
|
||||
## 🛡️ 安全最佳实践
|
||||
|
||||
### ✅ 推荐配置
|
||||
|
||||
```properties
|
||||
# 1. 明确配置信任主机白名单
|
||||
trust.host = your-cdn.com,your-storage.com
|
||||
|
||||
# 2. 配置黑名单防止内网访问
|
||||
not.trust.host = localhost,127.0.0.1,192.168.*,10.*,172.16.*
|
||||
|
||||
# 3. 禁用文件上传(生产环境)
|
||||
file.upload.disable = true
|
||||
|
||||
# 4. 配置基础URL(使用反向代理时)
|
||||
base.url = https://preview.yourdomain.com
|
||||
```
|
||||
|
||||
### ❌ 不推荐配置
|
||||
|
||||
```properties
|
||||
# 危险:允许所有主机访问
|
||||
trust.host = *
|
||||
|
||||
# 危险:启用文件上传(生产环境)
|
||||
file.upload.disable = false
|
||||
```
|
||||
|
||||
## 🔍 配置验证
|
||||
|
||||
### 测试白名单是否生效
|
||||
|
||||
1. 配置白名单:
|
||||
```properties
|
||||
trust.host = kkview.cn
|
||||
```
|
||||
|
||||
2. 尝试预览白名单内的文件:
|
||||
```
|
||||
http://localhost:8012/onlinePreview?url=https://kkview.cn/test.pdf
|
||||
✅ 应该可以正常预览
|
||||
```
|
||||
|
||||
3. 尝试预览白名单外的文件:
|
||||
```
|
||||
http://localhost:8012/onlinePreview?url=https://other-domain.com/test.pdf
|
||||
❌ 应该被拒绝,显示"不信任的文件源"
|
||||
```
|
||||
|
||||
### 测试黑名单是否生效
|
||||
|
||||
1. 配置黑名单:
|
||||
```properties
|
||||
not.trust.host = localhost,127.0.0.1
|
||||
```
|
||||
|
||||
2. 尝试访问本地文件:
|
||||
```
|
||||
http://localhost:8012/getCorsFile?urlPath=http://127.0.0.1:8080/admin
|
||||
❌ 应该被拒绝
|
||||
```
|
||||
|
||||
## 📋 常见问题
|
||||
|
||||
### Q1: 升级后无法预览文件了?
|
||||
|
||||
**原因**:新版本默认拒绝未配置的主机。
|
||||
|
||||
**解决**:在配置文件中添加信任主机列表:
|
||||
```properties
|
||||
trust.host = your-file-server.com
|
||||
```
|
||||
|
||||
### Q2: 如何临时恢复旧版本行为?
|
||||
|
||||
**不推荐**,但如果确实需要:
|
||||
```properties
|
||||
trust.host = *
|
||||
```
|
||||
|
||||
### Q3: 配置了白名单但还是无法访问?
|
||||
|
||||
检查以下几点:
|
||||
1. 域名是否完全匹配(区分大小写)
|
||||
2. 是否配置了黑名单,黑名单优先级更高
|
||||
3. 查看日志中的 WARNING 信息
|
||||
4. 确认环境变量是否正确设置
|
||||
|
||||
### Q4: 如何允许子域名?
|
||||
|
||||
已支持通配符域名匹配,可使用 `*.example.com`:
|
||||
```properties
|
||||
trust.host = *.example.com
|
||||
```
|
||||
|
||||
说明:
|
||||
- `*.example.com` 会匹配 `cdn.example.com`、`api.internal.example.com`,但不匹配根域 `example.com`
|
||||
- 对于 IP 风格通配(如 `192.168.*`、`10.*`),仅匹配字面量 IPv4 地址,不匹配域名
|
||||
|
||||
## 🚨 安全事件响应
|
||||
|
||||
如果发现可疑的预览请求:
|
||||
|
||||
1. 检查日志文件,搜索 "拒绝访问主机" 关键字
|
||||
2. 确认 `trust.host` 配置是否合理
|
||||
3. 检查是否有异常的网络请求
|
||||
4. 如发现攻击行为,及时更新黑名单配置
|
||||
|
||||
## 📞 获取帮助
|
||||
|
||||
- GitHub Issues: https://github.com/kekingcn/kkFileView/issues
|
||||
- Gitee Issues: https://gitee.com/kekingcn/file-online-preview/issues
|
||||
|
||||
---
|
||||
|
||||
**安全提示**:定期检查和更新信任主机列表,遵循最小权限原则。
|
||||
57
doc/ci-auto-deploy.md
Normal file
@@ -0,0 +1,57 @@
|
||||
# kkFileView master 自动部署
|
||||
|
||||
当前线上 Windows 服务器的实际部署信息如下:
|
||||
|
||||
- 部署根目录:`C:\kkFileView-5.0`
|
||||
- 运行 jar:`C:\kkFileView-5.0\bin\kkFileView-<当前项目版本>.jar`
|
||||
- 启动脚本:`C:\kkFileView-5.0\bin\startup.bat`
|
||||
- 运行配置:`C:\kkFileView-5.0\config\test.properties`
|
||||
- 健康检查地址:`http://127.0.0.1:8012/`
|
||||
|
||||
当前自动部署链路采用服务器拉最新源码并本机编译的方式:
|
||||
|
||||
1. 通过 WinRM 连接 Windows 服务器
|
||||
2. 在服务器上的源码目录执行 `git fetch/reset/clean`,同步到 `origin/$KK_DEPLOY_BRANCH`(默认 `master`)
|
||||
3. 使用服务器上的 JDK 21 和 Maven 执行 `mvn clean package -Dmaven.test.skip=true`
|
||||
4. 备份线上 jar,替换为新构建产物
|
||||
5. 使用现有 `startup.bat` 重启,并做健康检查
|
||||
6. 如果健康检查失败,则自动回滚旧 jar 并重新拉起
|
||||
|
||||
## 需要配置的 GitHub Secrets
|
||||
|
||||
- `KK_DEPLOY_HOST`
|
||||
- `KK_DEPLOY_USERNAME`
|
||||
- `KK_DEPLOY_PASSWORD`
|
||||
|
||||
以下部署参数当前由 workflow 从 GitHub Secrets 读取;如果未单独配置,则使用脚本默认值:
|
||||
|
||||
- `KK_DEPLOY_PORT=5985`
|
||||
- `KK_DEPLOY_ROOT=C:\kkFileView-5.0`
|
||||
- `KK_DEPLOY_HEALTH_URL=http://127.0.0.1:8012/`
|
||||
|
||||
下面这些非敏感参数可以通过 workflow env 或 GitHub Variables 覆盖;未配置时会使用默认值:
|
||||
- `KK_DEPLOY_REPO_URL=https://github.com/kekingcn/kkFileView.git`
|
||||
- `KK_DEPLOY_BRANCH=master`
|
||||
- `KK_DEPLOY_SOURCE_ROOT=C:\kkFileView-source`
|
||||
- `KK_DEPLOY_JAVA_HOME=C:\Program Files\jdk-21.0.2`
|
||||
- `KK_DEPLOY_GIT_EXE=C:\kkFileView-tools\git\cmd\git.exe`
|
||||
- `KK_DEPLOY_MVN_CMD=C:\kkFileView-tools\maven\bin\mvn.cmd`
|
||||
- `KK_DEPLOY_MAVEN_SETTINGS=`
|
||||
|
||||
如果服务器到 GitHub 的拉取速度不稳定,也可以把 `KK_DEPLOY_REPO_URL` 改成你自己的 Git 镜像地址。
|
||||
如果服务器访问 Maven Central 不稳定,也可以通过 `KK_DEPLOY_MAVEN_SETTINGS` 指向自定义 `settings.xml`,切换到就近镜像仓库。
|
||||
|
||||
## 服务器前置环境
|
||||
|
||||
服务器需要具备以下工具:
|
||||
|
||||
- Git for Windows(推荐安装在 `C:\kkFileView-tools\git`)
|
||||
- Apache Maven 3.9.x(推荐安装在 `C:\kkFileView-tools\maven`)
|
||||
- JDK 21(当前线上已存在:`C:\Program Files\jdk-21.0.2`)
|
||||
|
||||
## Workflow
|
||||
|
||||
新增 workflow:`.github/workflows/master-auto-deploy.yml`
|
||||
|
||||
- 触发条件:`push` 到 `master`,或手动 `workflow_dispatch`
|
||||
- 部署方式:WinRM + 服务器源码同步 + 服务器本机 Maven 编译 + jar 替换/回滚
|
||||
44
doc/e2e-improvement-checklist.md
Normal file
@@ -0,0 +1,44 @@
|
||||
# E2E 完善清单(基于 PR342 回归经验)
|
||||
|
||||
## 背景
|
||||
本次手工回归已经验证了以下关键链路:
|
||||
- TXT
|
||||
- XLSX
|
||||
- ZIP
|
||||
- PDF
|
||||
- DOCX
|
||||
- MP4
|
||||
- CAD / DXF
|
||||
|
||||
但当前 GitHub CI 中,自动化 E2E 仅覆盖了其中一部分,且大多只断言 HTTP 200,没有校验最终预览效果。
|
||||
|
||||
## 本次落地目标
|
||||
|
||||
### 1. 补齐缺失的关键链路
|
||||
- [x] PDF 预览 smoke
|
||||
- [x] MP4 预览 smoke
|
||||
- [x] CAD / DXF 预览 smoke
|
||||
|
||||
### 2. 升级断言方式
|
||||
- [x] 不再只看 `status === 200`
|
||||
- [x] 增加标题/页面关键字断言,确认命中了正确预览模板
|
||||
- [x] 对 PDF / DOCX / CAD 增加“等待页 -> 最终页面”的轮询兼容
|
||||
|
||||
### 3. 补齐 CI 所需 fixture
|
||||
- [x] `sample.pdf` 进入 required fixture 清单
|
||||
- [x] `sample.mp4` 进入 required fixture 清单
|
||||
- [x] `text.dxf` 进入 required fixture 清单
|
||||
- [x] 将 MP4 与 DXF fixture 作为仓库内静态样例纳入 CI
|
||||
|
||||
### 4. 后续可继续增强(本次未全部落地)
|
||||
- [ ] 为 PDF / Office / CAD 增加截图型 nightly artifact
|
||||
- [ ] 为 `/picturesPreview` 增加独立 smoke
|
||||
- [ ] 为 OFD 增加稳定 fixture 和 smoke case
|
||||
- [ ] 为媒体预览增加更多格式(如 wav / mp3 / mov)
|
||||
- [ ] 为 CAD 增加第二份标准样例,避免单样例偏差
|
||||
- [ ] 将当前 HTML 测试报告模板收敛成 nightly 自动产物
|
||||
|
||||
## 预期收益
|
||||
- 让 CI 覆盖这次 PR342 真正验证过的关键主链路
|
||||
- 避免未来出现“CI 绿了,但 PDF / MP4 / CAD 实际挂了”的情况
|
||||
- 让 E2E 更接近用户真实感知,而不是仅验证接口可达
|
||||
BIN
doc/img/preview/preview-3ds.png
Normal file
|
After Width: | Height: | Size: 150 KiB |
BIN
doc/img/preview/preview-audio.png
Normal file
|
After Width: | Height: | Size: 28 KiB |
BIN
doc/img/preview/preview-bpmn.png
Normal file
|
After Width: | Height: | Size: 135 KiB |
BIN
doc/img/preview/preview-cad-image.png
Normal file
|
After Width: | Height: | Size: 138 KiB |
BIN
doc/img/preview/preview-cad-pdf.png
Normal file
|
After Width: | Height: | Size: 138 KiB |
BIN
doc/img/preview/preview-dcm.png
Normal file
|
After Width: | Height: | Size: 1.3 MiB |
BIN
doc/img/preview/preview-doc-image.png
Normal file
|
After Width: | Height: | Size: 159 KiB |
BIN
doc/img/preview/preview-doc-pdf.png
Normal file
|
After Width: | Height: | Size: 219 KiB |
BIN
doc/img/preview/preview-drawio.png
Normal file
|
After Width: | Height: | Size: 320 KiB |
BIN
doc/img/preview/preview-image.png
Normal file
|
After Width: | Height: | Size: 68 KiB |
BIN
doc/img/preview/preview-pdf-image.png
Normal file
|
After Width: | Height: | Size: 187 KiB |
BIN
doc/img/preview/preview-pdf-pdf.png
Normal file
|
After Width: | Height: | Size: 254 KiB |
BIN
doc/img/preview/preview-ppt-image.png
Normal file
|
After Width: | Height: | Size: 392 KiB |
BIN
doc/img/preview/preview-ppt-pdf.png
Normal file
|
After Width: | Height: | Size: 211 KiB |
BIN
doc/img/preview/preview-text.png
Normal file
|
After Width: | Height: | Size: 96 KiB |
BIN
doc/img/preview/preview-video.png
Normal file
|
After Width: | Height: | Size: 469 KiB |
BIN
doc/img/preview/preview-xls.png
Normal file
|
After Width: | Height: | Size: 96 KiB |
BIN
doc/img/preview/preview-xlsx-web.png
Normal file
|
After Width: | Height: | Size: 166 KiB |
BIN
doc/img/preview/preview-xmind.png
Normal file
|
After Width: | Height: | Size: 252 KiB |
BIN
doc/img/preview/preview-zip-inner.png
Normal file
|
After Width: | Height: | Size: 236 KiB |
BIN
doc/img/preview/preview-zip.png
Normal file
|
After Width: | Height: | Size: 35 KiB |
28
docker/kkfileview-base/Dockerfile
Normal file
@@ -0,0 +1,28 @@
|
||||
FROM ubuntu:24.04
|
||||
|
||||
RUN sed -i 's@//.*archive.ubuntu.com@//mirrors.aliyun.com@g' /etc/apt/sources.list.d/ubuntu.sources &&\
|
||||
sed -i 's@//security.ubuntu.com@//mirrors.aliyun.com@g' /etc/apt/sources.list.d/ubuntu.sources &&\
|
||||
sed -i 's@//ports.ubuntu.com@//mirrors.aliyun.com@g' /etc/apt/sources.list.d/ubuntu.sources &&\
|
||||
apt-get update &&\
|
||||
export DEBIAN_FRONTEND=noninteractive &&\
|
||||
apt-get install -y --no-install-recommends openjdk-21-jre tzdata locales xfonts-utils fontconfig libreoffice-nogui &&\
|
||||
echo 'Asia/Shanghai' > /etc/timezone &&\
|
||||
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime &&\
|
||||
localedef -i zh_CN -c -f UTF-8 -A /usr/share/locale/locale.alias zh_CN.UTF-8 &&\
|
||||
locale-gen zh_CN.UTF-8 &&\
|
||||
apt-get install -y --no-install-recommends ttf-mscorefonts-installer &&\
|
||||
apt-get install -y --no-install-recommends ttf-wqy-microhei ttf-wqy-zenhei xfonts-wqy &&\
|
||||
apt-get autoremove -y &&\
|
||||
apt-get clean &&\
|
||||
rm -rf /var/lib/apt/lists/*
|
||||
|
||||
# 内置一些常用的中文字体,避免普遍性乱码
|
||||
ADD fonts/* /usr/share/fonts/chinese/
|
||||
|
||||
RUN cd /usr/share/fonts/chinese &&\
|
||||
# 安装字体
|
||||
mkfontscale &&\
|
||||
mkfontdir &&\
|
||||
fc-cache -fv
|
||||
|
||||
ENV LANG=zh_CN.UTF-8 LC_ALL=zh_CN.UTF-8
|
||||
50
docker/kkfileview-base/README.cn.md
Normal file
@@ -0,0 +1,50 @@
|
||||
# 构建说明
|
||||
|
||||
由于 kkfileview 的基础运行环境很少变动且制作耗时较久,而 kkfileview 本身代码开发会频繁改动,因此把制作其 Docker 镜像的步骤拆分为两次:
|
||||
|
||||
首先制作 kkfileview 的基础镜像(kkfileview-base)。
|
||||
|
||||
然后使用 kkfileview-base 作为基础镜像进行构建,加快 kkfileview docker 镜像构建与发布。
|
||||
|
||||
执行如下命令即可构建基础镜像:
|
||||
> 这里镜像 tag 以 5.0.0 为例,本项目所维护的 Dockerfile 文件考虑了跨平台兼容性。 如果你需要用到 arm64 架构镜像, 则在arm64 架构机器上同样执行下面的构建命令即可
|
||||
|
||||
```shell
|
||||
docker build --tag keking/kkfileview-base:5.0.0 .
|
||||
```
|
||||
|
||||
|
||||
|
||||
## 跨平台构建
|
||||
|
||||
`docker buildx` 支持在一台机器上构建出多种平台架构的镜像。推荐使用该能力进行跨平台的镜像构建。
|
||||
例如,执行 `docker buildx build` 命令时加上 `--platform=linux/arm64` 参数即可构建出 arm64 架构镜像。这极大方便了那些没有arm64 架构机器却想构建 arm64 架构镜像的用户。
|
||||
|
||||
> 当前本项目仅支持构建 linux/amd64 和 linux/arm64 两种平台架构的镜像
|
||||
> buildx 的 builder driver 可以使用默认的 `docker` 类型, 若使用 `docker-container` 类型可以支持并行构建多种架构, 本文不再赘述, 有兴趣可以自行了解。参考 [Docker Buildx | Docker Documentation](https://docs.docker.com/buildx/working-with-buildx/#build-multi-platform-images)
|
||||
|
||||
**前提要求**
|
||||
|
||||
以当前机器为 amd64 (x86_64)架构为例。需要开启 docker 的 buildx 特性,以及开启 Linux 的 QEMU 用户模式:
|
||||
|
||||
> 使用 WSL2 的 Windows 用户如果安装了最新的 DockerDesktop, 则这些前提要求已满足, 无需额外下述设置。
|
||||
|
||||
1. 安装 docker buildx 客户端插件:
|
||||
> docker 版本要求 >=19.03
|
||||
|
||||
若已安装, 则跳过。详情参考 https://github.com/docker/buildx
|
||||
|
||||
2. 开启 QEMU 的用户模式功能, 并安装其它平台的模拟器:
|
||||
> Linux 内核要求 >=4.8
|
||||
|
||||
使用 `tonistiigi/binfmt` 镜像可快速开启并安装模拟器,执行下面命令:
|
||||
|
||||
```shell
|
||||
docker run --privileged --rm tonistiigi/binfmt --install all
|
||||
```
|
||||
|
||||
现在就可以愉快地开始构建了,构建命令示例:
|
||||
|
||||
```shell
|
||||
docker buildx build --platform=linux/amd64,linux/arm64 -t keking/kkfileview-base:5.0.0 --push .
|
||||
```
|
||||
53
docker/kkfileview-base/README.md
Normal file
@@ -0,0 +1,53 @@
|
||||
# Build Instructions
|
||||
|
||||
Since the base runtime environment for kkfileview rarely changes and takes a long time to build, while the kkfileview code itself is frequently updated, the process of building its Docker image is split into two steps:
|
||||
|
||||
First, create the base image for kkfileview (kkfileview-base).
|
||||
|
||||
Then, use kkfileview-base as the base image to build and speed up the kkfileview Docker image build and release process.
|
||||
|
||||
To build the base image, run the following command:
|
||||
|
||||
> In this example, the image tag is 5.0.0. The Dockerfile maintained in this project considers cross-platform compatibility. If you need an arm64 architecture image, run the same build command on an arm64 architecture machine.
|
||||
|
||||
```shell
|
||||
docker build --tag keking/kkfileview-base:5.0.0 .
|
||||
```
|
||||
|
||||
|
||||
|
||||
## Cross-Platform Build
|
||||
|
||||
`docker buildx` supports building images for multiple platform architectures on a single machine. It is recommended to use this capability for cross-platform image builds.
|
||||
For example, adding the `--platform=linux/arm64` parameter when executing the `docker buildx build` command will allow you to build an arm64 architecture image. This is particularly convenient for users who want to build arm64 images but don't have an arm64 machine.
|
||||
|
||||
> Currently, this project only supports building images for the linux/amd64 and linux/arm64 architectures.
|
||||
> The buildx builder driver can use the default `docker` type, but if you use the `docker-container` type, you can build multiple architectures in parallel. This README will not cover that in detail, you can learn more on your own. Refer to [Docker Buildx | Docker Documentation](https://docs.docker.com/buildx/working-with-buildx/#build-multi-platform-images)
|
||||
|
||||
**Prerequisites**
|
||||
|
||||
Assuming the current machine is amd64 (x86_64) architecture, you'll need to enable the docker buildx feature and enable Linux QEMU user mode:
|
||||
|
||||
> Windows users with WSL2 who have installed a recent version of Docker Desktop will already meet these prerequisites, so no additional setup is required.
|
||||
|
||||
1. Install the docker buildx client plugin:
|
||||
|
||||
> Docker version >=19.03 is required.
|
||||
|
||||
If it's already installed, you can skip this step. For more details, refer to https://github.com/docker/buildx.
|
||||
|
||||
2. Enable QEMU user mode and install emulators for other platforms:
|
||||
|
||||
> Linux kernel version >=4.8 is required.
|
||||
|
||||
You can quickly enable and install emulators using the tonistiigi/binfmt image by running the following command:
|
||||
|
||||
```shell
|
||||
docker run --privileged --rm tonistiigi/binfmt --install all
|
||||
```
|
||||
|
||||
Now you can enjoy the building. Here’s an example build command:
|
||||
|
||||
```shell
|
||||
docker buildx build --platform=linux/amd64,linux/arm64 -t keking/kkfileview-base:5.0.0 --push .
|
||||
```
|
||||
@@ -1,38 +0,0 @@
|
||||
FROM ubuntu:20.04
|
||||
MAINTAINER chenjh "842761733@qq.com"
|
||||
# 内置一些常用的中文字体,避免普遍性乱码
|
||||
COPY fonts/* /usr/share/fonts/chinese/
|
||||
RUN apt-get clean && apt-get update &&\
|
||||
sed -i 's/http:\/\/archive.ubuntu.com/https:\/\/mirrors.aliyun.com/g' /etc/apt/sources.list &&\
|
||||
sed -i 's/# deb/deb/g' /etc/apt/sources.list &&\
|
||||
apt-get install -y --reinstall ca-certificates &&\
|
||||
apt-get clean && apt-get update &&\
|
||||
apt-get install -y locales language-pack-zh-hans &&\
|
||||
localedef -i zh_CN -c -f UTF-8 -A /usr/share/locale/locale.alias zh_CN.UTF-8 && locale-gen zh_CN.UTF-8 &&\
|
||||
export DEBIAN_FRONTEND=noninteractive &&\
|
||||
apt-get install -y tzdata && ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime &&\
|
||||
apt-get install -y fontconfig ttf-mscorefonts-installer ttf-wqy-microhei ttf-wqy-zenhei xfonts-wqy &&\
|
||||
apt-get install -y wget &&\
|
||||
cd /tmp &&\
|
||||
wget https://kkview.cn/resource/server-jre-8u251-linux-x64.tar.gz &&\
|
||||
tar -zxf /tmp/server-jre-8u251-linux-x64.tar.gz && mv /tmp/jdk1.8.0_251 /usr/local/ &&\
|
||||
|
||||
# 安装 libreoffice
|
||||
apt-get install -y libxrender1 libxinerama1 libxt6 libxext-dev libfreetype6-dev libcairo2 libcups2 libx11-xcb1 libnss3 &&\
|
||||
wget https://downloadarchive.documentfoundation.org/libreoffice/old/7.5.3.2/deb/x86_64/LibreOffice_7.5.3.2_Linux_x86-64_deb.tar.gz -cO libreoffice_deb.tar.gz &&\
|
||||
tar -zxf /tmp/libreoffice_deb.tar.gz && cd /tmp/LibreOffice_7.5.3.2_Linux_x86-64_deb/DEBS &&\
|
||||
dpkg -i *.deb &&\
|
||||
|
||||
# 清理临时文件
|
||||
rm -rf /tmp/* && rm -rf /var/lib/apt/lists/* &&\
|
||||
cd /usr/share/fonts/chinese &&\
|
||||
mkfontscale &&\
|
||||
mkfontdir &&\
|
||||
fc-cache -fv
|
||||
|
||||
ENV JAVA_HOME /usr/local/jdk1.8.0_251
|
||||
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
|
||||
ENV PATH $PATH:$JAVA_HOME/bin
|
||||
ENV LANG zh_CN.UTF-8
|
||||
ENV LC_ALL zh_CN.UTF-8
|
||||
CMD ["/bin/bash"]
|
||||
@@ -1,77 +0,0 @@
|
||||
FROM arm64v8/ubuntu:20.04
|
||||
MAINTAINER chenjh "842761733@qq.com"
|
||||
# 内置一些常用的中文字体,避免普遍性乱码
|
||||
COPY fonts/* /usr/share/fonts/chinese/
|
||||
RUN apt-get clean && apt-get update &&\
|
||||
sed -i 's/http:\/\/archive.ubuntu.com/https:\/\/mirrors.aliyun.com/g' /etc/apt/sources.list &&\
|
||||
sed -i 's/# deb/deb/g' /etc/apt/sources.list &&\
|
||||
apt-get install -y --reinstall ca-certificates &&\
|
||||
apt-get clean && apt-get update &&\
|
||||
apt-get install -y locales language-pack-zh-hans &&\
|
||||
localedef -i zh_CN -c -f UTF-8 -A /usr/share/locale/locale.alias zh_CN.UTF-8 && locale-gen zh_CN.UTF-8 &&\
|
||||
export DEBIAN_FRONTEND=noninteractive &&\
|
||||
apt-get install -y tzdata && ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime &&\
|
||||
apt-get install -y fontconfig ttf-mscorefonts-installer ttf-wqy-microhei ttf-wqy-zenhei xfonts-wqy &&\
|
||||
apt-get install -y wget
|
||||
# 安装 arm64-jre8
|
||||
RUN apt-get install -y openjdk-8-jre
|
||||
# 编译 libreoffice
|
||||
RUN apt-get install -y git build-essential zip ccache junit4 libkrb5-dev nasm graphviz python3 python3-dev qtbase5-dev libkf5coreaddons-dev libkf5i18n-dev libkf5config-dev libkf5windowsystem-dev libkf5kio-dev autoconf libcups2-dev libfontconfig1-dev gperf default-jdk doxygen libxslt1-dev xsltproc libxml2-utils libxrandr-dev libx11-dev bison flex libgtk-3-dev libgstreamer-plugins-base1.0-dev libgstreamer1.0-dev ant ant-optional libnss3-dev libavahi-client-dev libxt-dev &&\
|
||||
# 安装 ccache(重复编译时加快速度)
|
||||
apt-get install ccache &&\
|
||||
ccache -M 10G &&\
|
||||
# clone主代码
|
||||
mkdir /opt/libreoffice
|
||||
WORKDIR /opt/libreoffice
|
||||
RUN git clone --depth=1 --branch libreoffice-7-5 git://go.suokunlong.cn/lo/core ./libreoffice-7-5
|
||||
# 配置&抓取子模块
|
||||
WORKDIR /opt/libreoffice/libreoffice-7-5
|
||||
RUN git submodule init &&\
|
||||
git config --unset-all submodule.dictionaries.active &&\
|
||||
git config --unset-all submodule.dictionaries.url &&\
|
||||
git config --unset-all submodule.helpcontent2.active &&\
|
||||
git config --unset-all submodule.helpcontent2.url &&\
|
||||
git submodule update --progress --depth=1 &&\
|
||||
# 下载第三方依赖
|
||||
mkdir -p /opt/libreoffice/ext &&\
|
||||
wget --recursive --no-parent --no-check-certificate -P /opt/libreoffice/ext https://go.suokunlong.cn:88/dl/libreoffice/external_tarballs/
|
||||
RUN mv /opt/libreoffice/ext/go.suokunlong.cn:88/dl/libreoffice/external_tarballs/* /opt/libreoffice/ext
|
||||
# 配置编译选项
|
||||
RUN cat << EOF > autogen.input \
|
||||
&& echo "--without-help" >> autogen.input \
|
||||
&& echo "--without-helppack-integration" >> autogen.input \
|
||||
&& echo "--with-lang=zh-CN zh-TW" >> autogen.input \
|
||||
&& echo "--disable-online-update" >> autogen.input \
|
||||
&& echo "--disable-breakpad" >> autogen.input \
|
||||
&& echo "--disable-odk" >> autogen.input \
|
||||
&& echo "--without-doxygen" >> autogen.input \
|
||||
&& echo "--with-external-tar=/opt/libreoffice/ext" >> autogen.input \
|
||||
&& echo "--without-java" >> autogen.input \
|
||||
&& echo "--enable-firebird-sdbc" >> autogen.input \
|
||||
&& echo "--without-system-firebird" >> autogen.input \
|
||||
&& echo "--enable-python=internal" >> autogen.input
|
||||
# 预编译
|
||||
RUN ./autogen.sh
|
||||
# 因为libreoffice的安全策略,不允许root用户执行编译操作(可以改Makefile文件解决),所以新建用户
|
||||
RUN useradd libreoffice
|
||||
# 切换用户
|
||||
RUN su libreoffice
|
||||
# 在普通用户下编译
|
||||
RUN make || true
|
||||
# !!!编译40分钟左右会报错,此时需要执行以下操作重新编译
|
||||
RUN cp ./workdir/UnpackedTarball/python3/build/lib.linux-aarch64-3.8/_sysconfigdata__linux_aarch64-linux-gnu.py ./workdir/UnpackedTarball/python3/build/lib.linux-aarch64-3.8/_sysconfigdata__linux_aarch64-unknown-linux-gnu.py
|
||||
# 重新编译
|
||||
RUN make &&\
|
||||
make install
|
||||
|
||||
RUN ln -s /usr/local/lib/libreoffice/program/soffice /usr/bin/libreoffice
|
||||
|
||||
# 清理临时文件
|
||||
RUN rm -rf /tmp/* && rm -rf /var/lib/apt/lists/* &&\
|
||||
cd /usr/share/fonts/chinese &&\
|
||||
mkfontscale &&\
|
||||
mkfontdir &&\
|
||||
fc-cache -fv
|
||||
ENV LANG zh_CN.UTF-8
|
||||
ENV LC_ALL zh_CN.UTF-8
|
||||
CMD ["/bin/bash"]
|
||||
@@ -1,5 +0,0 @@
|
||||
# 执行如下命令构建基础镜像,加快kkfileview docker镜像构建与发布
|
||||
docker build --tag keking/kkfileview-jdk:4.3.0 .
|
||||
|
||||
# arm64架构执行如下命令
|
||||
docker build -f Dockerfile_arm64 --tag keking/kkfileview-jdk:4.3.0 .
|
||||
93
pom.xml
@@ -6,53 +6,75 @@
|
||||
|
||||
<groupId>cn.keking</groupId>
|
||||
<artifactId>kkFileView-parent</artifactId>
|
||||
<version>4.4.0-beta</version>
|
||||
<version>5.0.0</version>
|
||||
|
||||
<properties>
|
||||
<java.version>1.8</java.version>
|
||||
<jodconverter.version>4.4.6</jodconverter.version>
|
||||
<spring.boot.version>2.4.2</spring.boot.version>
|
||||
<poi.version>5.2.2</poi.version>
|
||||
<xdocreport.version>1.0.6</xdocreport.version>
|
||||
<xstream.version>1.4.20</xstream.version>
|
||||
<junrar.version>7.5.5</junrar.version>
|
||||
<redisson.version>3.2.0</redisson.version>
|
||||
<sevenzipjbinding.version>16.02-2.01</sevenzipjbinding.version>
|
||||
<jchardet.version>1.0</jchardet.version>
|
||||
<antlr.version>2.7.7</antlr.version>
|
||||
<concurrentlinkedhashmap.version>1.4.2</concurrentlinkedhashmap.version>
|
||||
<rocksdb.version>5.17.2</rocksdb.version>
|
||||
<pdfbox.version>2.0.29</pdfbox.version>
|
||||
<jai-imageio.version>1.4.0</jai-imageio.version>
|
||||
<jbig2-imageio.version>3.0.4</jbig2-imageio.version>
|
||||
<galimatias.version>0.2.1</galimatias.version>
|
||||
<bytedeco.version>1.5.2</bytedeco.version>
|
||||
<opencv.version>4.1.2-1.5.2</opencv.version>
|
||||
<openblas.version>0.3.6-1.5.1</openblas.version>
|
||||
<ffmpeg.version>4.2.1-1.5.2</ffmpeg.version>
|
||||
<itextpdf.version>5.5.13.3</itextpdf.version>
|
||||
<httpclient.version>3.1</httpclient.version>
|
||||
<aspose-cad.version>23.9</aspose-cad.version>
|
||||
<bcprov-jdk15on.version>1.70</bcprov-jdk15on.version>
|
||||
<juniversalchardet.version>1.0.3</juniversalchardet.version>
|
||||
<httpcomponents.version>4.5.14</httpcomponents.version>
|
||||
|
||||
<commons-cli.version>1.5.0</commons-cli.version>
|
||||
<commons-net.version>3.9.0</commons-net.version>
|
||||
<commons-lang3.version>3.13.0</commons-lang3.version>
|
||||
|
||||
|
||||
<!-- ========== Java 和编译配置 ========== -->
|
||||
<java.version>21</java.version>
|
||||
<maven.compiler.source>${java.version}</maven.compiler.source>
|
||||
<maven.compiler.release>${java.version}</maven.compiler.release>
|
||||
<maven.compiler.target>${java.version}</maven.compiler.target>
|
||||
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
|
||||
|
||||
<!-- ========== Spring 框架 ========== -->
|
||||
<spring.boot.version>3.5.6</spring.boot.version>
|
||||
|
||||
<!-- ========== 文档转换和Office处理 ========== -->
|
||||
<jodconverter.version>4.4.11</jodconverter.version>
|
||||
<poi.version>5.2.5</poi.version>
|
||||
<xdocreport.version>1.0.6</xdocreport.version>
|
||||
<aspose-cad.version>25.10</aspose-cad.version>
|
||||
|
||||
<!-- ========== PDF 处理 ========== -->
|
||||
<pdfbox.version>3.0.6</pdfbox.version>
|
||||
|
||||
<!-- ========== 图像处理 ========== -->
|
||||
<jai-imageio.version>1.4.0</jai-imageio.version>
|
||||
<jbig2-imageio.version>3.0.4</jbig2-imageio.version>
|
||||
<commons-imaging.version>1.0.0-alpha6</commons-imaging.version>
|
||||
|
||||
<!-- ========== 视频处理 (JavaCV) ========== -->
|
||||
<bytedeco.version>1.5.12</bytedeco.version>
|
||||
<opencv.version>4.11.0-1.5.12</opencv.version>
|
||||
<openblas.version>0.3.30-1.5.12</openblas.version>
|
||||
<ffmpeg.version>7.1.1-1.5.12</ffmpeg.version>
|
||||
|
||||
<!-- ========== 压缩文件处理 ========== -->
|
||||
<sevenzipjbinding.version>16.02-2.01</sevenzipjbinding.version>
|
||||
<junrar.version>7.5.5</junrar.version>
|
||||
|
||||
<!-- ========== 缓存和存储 ========== -->
|
||||
<redisson.version>4.0.0</redisson.version>
|
||||
<rocksdb.version>5.17.2</rocksdb.version>
|
||||
<concurrentlinkedhashmap.version>1.4.2</concurrentlinkedhashmap.version>
|
||||
|
||||
<!-- ========== 网络通信 ========== -->
|
||||
<httpcomponents.version>4.5.16</httpcomponents.version>
|
||||
<commons-net.version>3.12.0</commons-net.version>
|
||||
|
||||
<!-- ========== Apache Commons 工具库 ========== -->
|
||||
<commons-lang3.version>3.20.0</commons-lang3.version>
|
||||
<commons-cli.version>1.11.0</commons-cli.version>
|
||||
|
||||
<!-- ========== 编码和字符处理 ========== -->
|
||||
<juniversalchardet.version>1.0.3</juniversalchardet.version>
|
||||
<jchardet.version>1.0</jchardet.version>
|
||||
|
||||
<!-- ========== 安全相关 ========== -->
|
||||
<bcprov-jdk15on.version>1.70</bcprov-jdk15on.version>
|
||||
|
||||
<!-- ========== 其他工具库 ========== -->
|
||||
<xstream.version>1.4.21</xstream.version>
|
||||
<antlr.version>2.7.7</antlr.version>
|
||||
<galimatias.version>0.2.1</galimatias.version>
|
||||
</properties>
|
||||
|
||||
<modules>
|
||||
<module>server</module>
|
||||
</modules>
|
||||
|
||||
<!-- ========== 项目信息 ========== -->
|
||||
<name>kkFileView-parent</name>
|
||||
<description>专注文件在线预览服务</description>
|
||||
<url>https://github.com/kekingcn/kkFileView</url>
|
||||
@@ -88,5 +110,4 @@
|
||||
<system>github</system>
|
||||
<url>https://github.com/kekingcn/kkFileView/issues</url>
|
||||
</issueManagement>
|
||||
|
||||
</project>
|
||||
|
||||
383
server/pom.xml
@@ -6,7 +6,7 @@
|
||||
<parent>
|
||||
<artifactId>kkFileView-parent</artifactId>
|
||||
<groupId>cn.keking</groupId>
|
||||
<version>4.4.0-beta</version>
|
||||
<version>5.0.0</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>kkFileView</artifactId>
|
||||
@@ -24,44 +24,49 @@
|
||||
</dependencyManagement>
|
||||
|
||||
<repositories>
|
||||
<repository>
|
||||
<id>aspose-maven-repository</id>
|
||||
<url>https://repository.aspose.com/repo</url>
|
||||
<snapshots>
|
||||
<enabled>false</enabled>
|
||||
</snapshots>
|
||||
</repository>
|
||||
</repositories>
|
||||
|
||||
<!-- Aspose 仓库,且只启用 releases -->
|
||||
<repository>
|
||||
<id>aspose-maven-repository</id>
|
||||
<url>https://repository.aspose.com/repo</url>
|
||||
<releases>
|
||||
<enabled>true</enabled>
|
||||
</releases>
|
||||
<snapshots>
|
||||
<enabled>false</enabled>
|
||||
</snapshots>
|
||||
</repository>
|
||||
</repositories>
|
||||
|
||||
<dependencies>
|
||||
<!-- ========== Spring Boot 框架依赖 ========== -->
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-web</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-freemarker</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-actuator</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-devtools</artifactId>
|
||||
<scope>runtime</scope>
|
||||
<optional>true</optional>
|
||||
</dependency>
|
||||
|
||||
<!-- ========== 文档格式转换 ========== -->
|
||||
<dependency>
|
||||
<groupId>org.jodconverter</groupId>
|
||||
<artifactId>jodconverter-local</artifactId>
|
||||
<version>${jodconverter.version}</version>
|
||||
</dependency>
|
||||
|
||||
<!-- web start -->
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-web</artifactId>
|
||||
<exclusions>
|
||||
<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-jetty</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-freemarker</artifactId>
|
||||
</dependency>
|
||||
<!-- web end -->
|
||||
|
||||
<!-- poi start -->
|
||||
<!-- ========== Office文档处理 (POI相关) ========== -->
|
||||
<dependency>
|
||||
<groupId>org.apache.poi</groupId>
|
||||
<artifactId>poi</artifactId>
|
||||
@@ -98,14 +103,31 @@
|
||||
<artifactId>fr.opensagres.xdocreport.document</artifactId>
|
||||
<version>${xdocreport.version}</version>
|
||||
</dependency>
|
||||
<!-- poi start -->
|
||||
<dependency>
|
||||
<groupId>org.apache.httpcomponents</groupId>
|
||||
<artifactId>httpclient</artifactId>
|
||||
<version>${httpcomponents.version}</version>
|
||||
<groupId>com.aspose</groupId>
|
||||
<artifactId>aspose-cad</artifactId>
|
||||
<version>${aspose-cad.version}</version>
|
||||
</dependency>
|
||||
|
||||
<!-- 对 rar5 的支持 和其他众多压缩支持 可参考 package net.sf.sevenzipjbinding.ArchiveFormat; -->
|
||||
<!-- ========== PDF处理 ========== -->
|
||||
<dependency>
|
||||
<groupId>org.apache.pdfbox</groupId>
|
||||
<artifactId>pdfbox</artifactId>
|
||||
<version>${pdfbox.version}</version>
|
||||
<exclusions>
|
||||
<exclusion>
|
||||
<artifactId>commons-logging</artifactId>
|
||||
<groupId>commons-logging</groupId>
|
||||
</exclusion>
|
||||
</exclusions>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.pdfbox</groupId>
|
||||
<artifactId>pdfbox-tools</artifactId>
|
||||
<version>${pdfbox.version}</version>
|
||||
</dependency>
|
||||
|
||||
<!-- ========== 压缩文件处理 ========== -->
|
||||
<dependency>
|
||||
<groupId>net.sf.sevenzipjbinding</groupId>
|
||||
<artifactId>sevenzipjbinding</artifactId>
|
||||
@@ -116,78 +138,13 @@
|
||||
<artifactId>sevenzipjbinding-all-platforms</artifactId>
|
||||
<version>${sevenzipjbinding.version}</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.apache.commons</groupId>
|
||||
<artifactId>commons-lang3</artifactId>
|
||||
<version>${commons-lang3.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.redisson</groupId>
|
||||
<artifactId>redisson</artifactId>
|
||||
<version>${redisson.version}</version>
|
||||
</dependency>
|
||||
|
||||
<!-- 编码检测-JUniversalCharDet-->
|
||||
<dependency>
|
||||
<groupId>com.googlecode.juniversalchardet</groupId>
|
||||
<artifactId>juniversalchardet</artifactId>
|
||||
<version>${juniversalchardet.version}</version>
|
||||
</dependency>
|
||||
|
||||
<!-- 解压(rar)-->
|
||||
<dependency>
|
||||
<groupId>com.github.junrar</groupId>
|
||||
<artifactId>junrar</artifactId>
|
||||
<version>${junrar.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>net.sourceforge.jchardet</groupId>
|
||||
<artifactId>jchardet</artifactId>
|
||||
<version>${jchardet.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>antlr</groupId>
|
||||
<artifactId>antlr</artifactId>
|
||||
<version>${antlr.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>commons-cli</groupId>
|
||||
<artifactId>commons-cli</artifactId>
|
||||
<version>${commons-cli.version}</version>
|
||||
</dependency>
|
||||
|
||||
<!-- FTP -->
|
||||
<dependency>
|
||||
<groupId>commons-net</groupId>
|
||||
<artifactId>commons-net</artifactId>
|
||||
<version>${commons-net.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.thoughtworks.xstream</groupId>
|
||||
<artifactId>xstream</artifactId>
|
||||
<version>${xstream.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.googlecode.concurrentlinkedhashmap</groupId>
|
||||
<artifactId>concurrentlinkedhashmap-lru</artifactId>
|
||||
<version>${concurrentlinkedhashmap.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.rocksdb</groupId>
|
||||
<artifactId>rocksdbjni</artifactId>
|
||||
<version>${rocksdb.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.pdfbox</groupId>
|
||||
<artifactId>pdfbox</artifactId>
|
||||
<version>${pdfbox.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.pdfbox</groupId>
|
||||
<artifactId>pdfbox-tools</artifactId>
|
||||
<version>${pdfbox.version}</version>
|
||||
</dependency>
|
||||
<!-- ========== 图像处理 ========== -->
|
||||
<dependency>
|
||||
<groupId>com.github.jai-imageio</groupId>
|
||||
<artifactId>jai-imageio-jpeg2000</artifactId>
|
||||
@@ -203,79 +160,12 @@
|
||||
<artifactId>jbig2-imageio</artifactId>
|
||||
<version>${jbig2-imageio.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.aspose</groupId>
|
||||
<artifactId>aspose-cad</artifactId>
|
||||
<version>${aspose-cad.version}</version>
|
||||
</dependency>
|
||||
<!-- 密钥算法 -->
|
||||
<dependency>
|
||||
<groupId>org.bouncycastle</groupId>
|
||||
<artifactId>bcprov-jdk15on</artifactId>
|
||||
<version>${bcprov-jdk15on.version}</version>
|
||||
<groupId>org.apache.commons</groupId>
|
||||
<artifactId>commons-imaging</artifactId>
|
||||
<version>${commons-imaging.version}</version>
|
||||
</dependency>
|
||||
<!-- url 规范化 -->
|
||||
<dependency>
|
||||
<groupId>io.mola.galimatias</groupId>
|
||||
<artifactId>galimatias</artifactId>
|
||||
<version>${galimatias.version}</version>
|
||||
</dependency>
|
||||
|
||||
<!-- 以下是bytedeco 基于opencv ffmpeg封装的javacv,用于视频处理 -->
|
||||
<dependency>
|
||||
<groupId>org.bytedeco</groupId>
|
||||
<artifactId>javacv</artifactId>
|
||||
<version>${bytedeco.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.bytedeco</groupId>
|
||||
<artifactId>javacpp</artifactId>
|
||||
<version>${bytedeco.version}</version>
|
||||
</dependency>
|
||||
|
||||
<!-- 此版本中主要兼容linux和windows系统,如需兼容其他系统平台,请引入对应依赖即可 -->
|
||||
<dependency>
|
||||
<groupId>org.bytedeco</groupId>
|
||||
<artifactId>opencv</artifactId>
|
||||
<version>${opencv.version}</version>
|
||||
<classifier>linux-x86_64</classifier>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.bytedeco</groupId>
|
||||
<artifactId>opencv</artifactId>
|
||||
<version>${opencv.version}</version>
|
||||
<classifier>windows-x86_64</classifier>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.bytedeco</groupId>
|
||||
<artifactId>openblas</artifactId>
|
||||
<version>${openblas.version}</version>
|
||||
<classifier>linux-x86_64</classifier>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.bytedeco</groupId>
|
||||
<artifactId>openblas</artifactId>
|
||||
<version>${openblas.version}</version>
|
||||
<classifier>windows-x86_64</classifier>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.bytedeco</groupId>
|
||||
<artifactId>ffmpeg</artifactId>
|
||||
<version>${ffmpeg.version}</version>
|
||||
<classifier>linux-x86_64</classifier>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.bytedeco</groupId>
|
||||
<artifactId>ffmpeg</artifactId>
|
||||
<version>${ffmpeg.version}</version>
|
||||
<classifier>windows-x86_64</classifier>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.itextpdf</groupId>
|
||||
<artifactId>itextpdf</artifactId>
|
||||
<version>${itextpdf.version}</version>
|
||||
</dependency>
|
||||
|
||||
<!-- JAI 系统依赖 -->
|
||||
<dependency>
|
||||
<groupId>javax.media</groupId>
|
||||
<artifactId>jai_core</artifactId>
|
||||
@@ -291,25 +181,134 @@
|
||||
<systemPath>${pom.basedir}/lib/jai_codec-1.1.3.jar</systemPath>
|
||||
</dependency>
|
||||
|
||||
<!-- test dependency - start -->
|
||||
<!-- ========== 视频处理 (JavaCV) ========== -->
|
||||
<dependency>
|
||||
<groupId>org.bytedeco</groupId>
|
||||
<artifactId>javacv</artifactId>
|
||||
<version>${bytedeco.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.bytedeco</groupId>
|
||||
<artifactId>javacpp</artifactId>
|
||||
<version>${bytedeco.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.bytedeco</groupId>
|
||||
<artifactId>opencv</artifactId>
|
||||
<version>${opencv.version}</version>
|
||||
<classifier>linux-x86_64</classifier>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.bytedeco</groupId>
|
||||
<artifactId>opencv</artifactId>
|
||||
<version>${opencv.version}</version>
|
||||
<classifier>windows-x86_64</classifier>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.bytedeco</groupId>
|
||||
<artifactId>openblas</artifactId>
|
||||
<version>${openblas.version}</version>
|
||||
<classifier>linux-x86_64</classifier>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.bytedeco</groupId>
|
||||
<artifactId>openblas</artifactId>
|
||||
<version>${openblas.version}</version>
|
||||
<classifier>windows-x86_64</classifier>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.bytedeco</groupId>
|
||||
<artifactId>ffmpeg</artifactId>
|
||||
<version>${ffmpeg.version}</version>
|
||||
<classifier>linux-x86_64</classifier>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.bytedeco</groupId>
|
||||
<artifactId>ffmpeg</artifactId>
|
||||
<version>${ffmpeg.version}</version>
|
||||
<classifier>windows-x86_64</classifier>
|
||||
</dependency>
|
||||
|
||||
<!-- ========== 网络通信 ========== -->
|
||||
<dependency>
|
||||
<groupId>org.apache.httpcomponents.client5</groupId>
|
||||
<artifactId>httpclient5</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>commons-net</groupId>
|
||||
<artifactId>commons-net</artifactId>
|
||||
<version>${commons-net.version}</version>
|
||||
</dependency>
|
||||
|
||||
<!-- ========== 缓存和存储 ========== -->
|
||||
<dependency>
|
||||
<groupId>org.redisson</groupId>
|
||||
<artifactId>redisson</artifactId>
|
||||
<version>${redisson.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.rocksdb</groupId>
|
||||
<artifactId>rocksdbjni</artifactId>
|
||||
<version>${rocksdb.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.googlecode.concurrentlinkedhashmap</groupId>
|
||||
<artifactId>concurrentlinkedhashmap-lru</artifactId>
|
||||
<version>${concurrentlinkedhashmap.version}</version>
|
||||
</dependency>
|
||||
|
||||
<!-- ========== 编码检测和字符处理 ========== -->
|
||||
<dependency>
|
||||
<groupId>com.googlecode.juniversalchardet</groupId>
|
||||
<artifactId>juniversalchardet</artifactId>
|
||||
<version>${juniversalchardet.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>net.sourceforge.jchardet</groupId>
|
||||
<artifactId>jchardet</artifactId>
|
||||
<version>${jchardet.version}</version>
|
||||
</dependency>
|
||||
|
||||
<!-- ========== Apache Commons 工具库 ========== -->
|
||||
<dependency>
|
||||
<groupId>org.apache.commons</groupId>
|
||||
<artifactId>commons-lang3</artifactId>
|
||||
<version>${commons-lang3.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>commons-cli</groupId>
|
||||
<artifactId>commons-cli</artifactId>
|
||||
<version>${commons-cli.version}</version>
|
||||
</dependency>
|
||||
|
||||
<!-- ========== 其他工具库 ========== -->
|
||||
<dependency>
|
||||
<groupId>antlr</groupId>
|
||||
<artifactId>antlr</artifactId>
|
||||
<version>${antlr.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.thoughtworks.xstream</groupId>
|
||||
<artifactId>xstream</artifactId>
|
||||
<version>${xstream.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.bouncycastle</groupId>
|
||||
<artifactId>bcprov-jdk15on</artifactId>
|
||||
<version>${bcprov-jdk15on.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>io.mola.galimatias</groupId>
|
||||
<artifactId>galimatias</artifactId>
|
||||
<version>${galimatias.version}</version>
|
||||
</dependency>
|
||||
|
||||
<!-- ========== 测试依赖 ========== -->
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-test</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>commons-httpclient</groupId>
|
||||
<artifactId>commons-httpclient</artifactId>
|
||||
<version>${httpclient.version}</version>
|
||||
<scope>test</scope>
|
||||
<exclusions>
|
||||
<exclusion>
|
||||
<artifactId>commons-logging</artifactId>
|
||||
<groupId>commons-logging</groupId>
|
||||
</exclusion>
|
||||
</exclusions>
|
||||
</dependency>
|
||||
<!-- test dependency - end -->
|
||||
</dependencies>
|
||||
|
||||
<build>
|
||||
@@ -327,6 +326,14 @@
|
||||
</resource>
|
||||
</resources>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-compiler-plugin</artifactId>
|
||||
<version>3.11.0</version>
|
||||
<configuration>
|
||||
<parameters>true</parameters>
|
||||
</configuration>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-maven-plugin</artifactId>
|
||||
@@ -365,4 +372,4 @@
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
</project>
|
||||
</project>
|
||||
|
||||
16
server/src/main/bin/dev.sh
Executable file
@@ -0,0 +1,16 @@
|
||||
#!/bin/bash
|
||||
|
||||
set -e
|
||||
|
||||
ROOT_DIR=$(cd "$(dirname "$0")/../../../.." || exit 1; pwd)
|
||||
SERVER_DIR="$ROOT_DIR/server"
|
||||
|
||||
if [ -n "$JAVA_HOME" ]; then
|
||||
export PATH="$JAVA_HOME/bin:$PATH"
|
||||
fi
|
||||
|
||||
cd "$SERVER_DIR" || exit 1
|
||||
|
||||
mvn spring-boot:run \
|
||||
-Dspring-boot.run.addResources=true \
|
||||
-Dspring-boot.run.jvmArguments="-Dfile.encoding=UTF-8 -Dspring.config.location=$SERVER_DIR/src/main/config/application.properties"
|
||||