系统集成 onlyoffice
This commit is contained in:
parent
35245b1a5d
commit
026712b9b7
|
|
@ -9,8 +9,8 @@ minio:
|
||||||
# onlyoffice配置
|
# onlyoffice配置
|
||||||
onlyoffice:
|
onlyoffice:
|
||||||
document-server: http://192.168.0.14:19840/
|
document-server: http://192.168.0.14:19840/
|
||||||
secret: N9yleoAAnWNo4VY4Dpe0ihH02LpQOigz
|
secret: IF8oJPkqTQPnrnYGk0115PA10sKCE05Z
|
||||||
jwt-enabled: false
|
jwt-enabled: true
|
||||||
|
|
||||||
#minio:
|
#minio:
|
||||||
# url: http://127.0.0.1:9005
|
# url: http://127.0.0.1:9005
|
||||||
|
|
|
||||||
|
|
@ -38,4 +38,6 @@ public class OnlyOfficeJwtService {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,7 @@ import com.bonus.common.core.domain.model.LoginUser;
|
||||||
import com.bonus.common.domain.file.vo.OnlyOfficeCallback;
|
import com.bonus.common.domain.file.vo.OnlyOfficeCallback;
|
||||||
import com.bonus.common.utils.FileUtil;
|
import com.bonus.common.utils.FileUtil;
|
||||||
import com.bonus.common.utils.SecurityUtils;
|
import com.bonus.common.utils.SecurityUtils;
|
||||||
|
import com.bonus.common.utils.ip.IpUtils;
|
||||||
import com.bonus.file.config.OnlyOfficeConfig;
|
import com.bonus.file.config.OnlyOfficeConfig;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.data.redis.core.RedisTemplate;
|
import org.springframework.data.redis.core.RedisTemplate;
|
||||||
|
|
@ -14,6 +15,7 @@ import org.springframework.web.client.RestTemplate;
|
||||||
|
|
||||||
import javax.annotation.Resource;
|
import javax.annotation.Resource;
|
||||||
import java.io.ByteArrayInputStream;
|
import java.io.ByteArrayInputStream;
|
||||||
|
import java.net.URLEncoder;
|
||||||
import java.time.Duration;
|
import java.time.Duration;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
@ -47,19 +49,32 @@ public class OnlyOfficeService {
|
||||||
|
|
||||||
public Map<String, Object> getConfigWithToken(String fileKey, String fileName, String mode) throws Exception {
|
public Map<String, Object> getConfigWithToken(String fileKey, String fileName, String mode) throws Exception {
|
||||||
Map<String, Object> map = buildEditorConfig(fileKey, fileName, mode);
|
Map<String, Object> map = buildEditorConfig(fileKey, fileName, mode);
|
||||||
String token = onlyOfficeJwtService.generateToken(map);
|
log.info("map:{}",map);
|
||||||
|
String token = generateJwtToken(map);
|
||||||
|
boolean b = onlyOfficeJwtService.verifyToken(token);
|
||||||
|
log.info("b:{}",b);
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
Map<String, Object> editorConfig = (Map<String, Object>) map.getOrDefault("editorConfig", new HashMap<>());
|
||||||
|
log.info("token:{}",token);
|
||||||
|
// 添加token
|
||||||
|
editorConfig.put("token", token);
|
||||||
|
// 确保editorConfig被放回map中
|
||||||
|
map.put("editorConfig", editorConfig);
|
||||||
map.put("token", token);
|
map.put("token", token);
|
||||||
return map;
|
return map;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Map<String, Object> buildEditorConfig(String fileKey, String fileName, String mode) throws Exception {
|
public Map<String, Object> buildEditorConfig(String fileKey, String fileName, String mode) throws Exception {
|
||||||
String fileUrl = fileUploadService.getFile(fileName).getUrl();
|
|
||||||
|
|
||||||
|
// 清理文件名,只保留最终文件名
|
||||||
|
String cleanFileName = extractFileName(fileName);
|
||||||
|
String fileUrl = fileUploadService.getFile(fileName).getUrl();
|
||||||
|
// fileUrl = URLEncoder.encode(fileUrl, "UTF-8").replaceAll("\\+", "%20");
|
||||||
Map<String, Object> config = new HashMap<>();
|
Map<String, Object> config = new HashMap<>();
|
||||||
|
|
||||||
// 文档配置
|
// 文档配置
|
||||||
Map<String, Object> document = new HashMap<>();
|
Map<String, Object> document = new HashMap<>();
|
||||||
document.put("title", fileName);
|
document.put("title", cleanFileName);
|
||||||
document.put("url", fileUrl);
|
document.put("url", fileUrl);
|
||||||
document.put("fileType", getFileExtension(fileName));
|
document.put("fileType", getFileExtension(fileName));
|
||||||
document.put("key", fileKey);
|
document.put("key", fileKey);
|
||||||
|
|
@ -80,7 +95,10 @@ public class OnlyOfficeService {
|
||||||
|
|
||||||
// 自定义配置
|
// 自定义配置
|
||||||
Map<String, Object> customization = new HashMap<>();
|
Map<String, Object> customization = new HashMap<>();
|
||||||
customization.put("forcesave", true);
|
customization.put("forcesave", false);
|
||||||
|
customization.put("about", false);
|
||||||
|
customization.put("feedback", false);
|
||||||
|
customization.put("hideRightMenu", false);
|
||||||
customization.put("compactToolbar", false);
|
customization.put("compactToolbar", false);
|
||||||
editorConfig.put("customization", customization);
|
editorConfig.put("customization", customization);
|
||||||
|
|
||||||
|
|
@ -158,9 +176,10 @@ public class OnlyOfficeService {
|
||||||
}
|
}
|
||||||
|
|
||||||
private String buildCallbackUrl() {
|
private String buildCallbackUrl() {
|
||||||
return "http://192.168.0.39:" + onlyOfficeConfig.getServerPort() + "/smartBid/documents/callback";
|
return "http://" + IpUtils.getHostIp() +":" + onlyOfficeConfig.getServerPort() + "/smartBid/documents/callback";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private String getFileExtension(String fileName) {
|
private String getFileExtension(String fileName) {
|
||||||
return fileName.substring(fileName.lastIndexOf(".") + 1).toLowerCase();
|
return fileName.substring(fileName.lastIndexOf(".") + 1).toLowerCase();
|
||||||
}
|
}
|
||||||
|
|
@ -214,4 +233,41 @@ public class OnlyOfficeService {
|
||||||
.map(LoginUser::getUsername)
|
.map(LoginUser::getUsername)
|
||||||
.orElse(null);
|
.orElse(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 提取文件名(去掉路径)
|
||||||
|
private String extractFileName(String filePath) {
|
||||||
|
if (filePath == null) return "document";
|
||||||
|
int lastSlash = filePath.lastIndexOf("/");
|
||||||
|
int lastBackslash = filePath.lastIndexOf("\\");
|
||||||
|
int lastIndex = Math.max(lastSlash, lastBackslash);
|
||||||
|
return lastIndex >= 0 ? filePath.substring(lastIndex + 1) : filePath;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* 生成 JWT Token(OnlyOffice 专用格式)
|
||||||
|
*/
|
||||||
|
private String generateJwtToken(Map<String, Object> config) {
|
||||||
|
try {
|
||||||
|
// OnlyOffice 需要的 payload 结构
|
||||||
|
Map<String, Object> payload = new HashMap<>();
|
||||||
|
// 复制整个配置到 payload
|
||||||
|
payload.put("document", config.get("document"));
|
||||||
|
payload.put("editorConfig", config.get("editorConfig"));
|
||||||
|
payload.put("documentType", config.get("documentType"));
|
||||||
|
payload.put("type", config.get("type"));
|
||||||
|
payload.put("width", config.get("width"));
|
||||||
|
payload.put("height", config.get("height"));
|
||||||
|
|
||||||
|
// 使用 JWTUtil 生成 token
|
||||||
|
String token = onlyOfficeJwtService.generateToken(payload);
|
||||||
|
if (token == null) {
|
||||||
|
log.error("生成JWT Token失败");
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
log.debug("生成的JWT Token: {}", token);
|
||||||
|
return token;
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error("生成JWT Token异常", e);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue