mirror of
https://gitee.com/kekingcn/file-online-preview.git
synced 2026-04-29 03:26:44 +00:00
Compare commits
44 Commits
xmind
...
klboke-pat
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ab44f347fe | ||
|
|
9cf5e8691d | ||
|
|
ff1bfe5f98 | ||
|
|
c2c870668b | ||
|
|
b7ed284ae9 | ||
|
|
e33db39494 | ||
|
|
f13cccf5a6 | ||
|
|
c355c915f8 | ||
|
|
92a95db34c | ||
|
|
1a821706ee | ||
|
|
604e118036 | ||
|
|
871a83e3b5 | ||
|
|
6d3f9e7cfc | ||
|
|
b5e281a3b1 | ||
|
|
60d9ef7069 | ||
|
|
98a7217b10 | ||
|
|
a867effa68 | ||
|
|
058ebd8274 | ||
|
|
784eec99de | ||
|
|
3e2e330fcb | ||
|
|
e50a664e64 | ||
|
|
94503ddc39 | ||
|
|
99bdeef754 | ||
|
|
e08c41baa9 | ||
|
|
ca9eefb80b | ||
|
|
4962b8b3ca | ||
|
|
eb372686e6 | ||
|
|
daf506e1bd | ||
|
|
b239d5b440 | ||
|
|
09a3fd2db8 | ||
|
|
eb12ced77f | ||
|
|
5521386781 | ||
|
|
24698be8be | ||
|
|
6183e8c3e5 | ||
|
|
cdc146747b | ||
|
|
ca9fcf6cf6 | ||
|
|
daa081d46d | ||
|
|
be23560ee4 | ||
|
|
134ff34c5e | ||
|
|
f9e5fd01be | ||
|
|
e278d8f049 | ||
|
|
7a25e0cb34 | ||
|
|
e25cc2e47c | ||
|
|
8cb310ef93 |
17
README.cn.md
17
README.cn.md
@@ -1,14 +1,16 @@
|
||||
# kkFileView
|
||||
文档在线预览项目解决方案,项目使用流行的spring boot搭建,易上手和部署。万能的文件预览开源项目,基本支持主流文档格式预览,如:
|
||||
1. 支持 doc, docx, xls, xlsx, xlsm, ppt, pptx, csv, tsv 等 Office 办公文档
|
||||
2. 支持 wps, dps, et 等国产 WPS Office 办公文档
|
||||
1. 支持 doc, docx, xls, xlsx, xlsm, ppt, pptx, csv, tsv, dotm, xlt, xltm, dot, dotx,xlam, xla 等 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 流程图文件
|
||||
5. 支持 wmf, emf 等 Windows 系统图像文件
|
||||
6. 支持 psd 等 Photoshop 软件模型文件
|
||||
7. 支持 pdf ,ofd, rtf 等文档
|
||||
8. 支持 xmind 软件模型文件
|
||||
9. 支持 eml, epub 文档类型文件
|
||||
9. 支持 bpmn 工作流文件
|
||||
9. 支持 eml 邮件文件
|
||||
10. 支持 epub 图书文档
|
||||
10. 支持 obj, 3ds, stl, ply, gltf, glb, off, 3dm, fbx, dae, wrl, 3mf, ifc, brep, step, iges, fcstd, bim 等 3D 模型文件
|
||||
11. 支持 dwg, dxf 等 CAD 模型文件
|
||||
12. 支持 txt, xml(渲染), md(渲染), java, php, py, js, css 等所有纯文本
|
||||
@@ -17,7 +19,8 @@
|
||||
15. 支持 tif, tiff 图信息模型文件
|
||||
16. 支持 tga 图像格式文件
|
||||
17. 支持 svg 矢量图像格式文件
|
||||
18. 支持 avi, mov, wmv, mkv, 3gp, rm 等众多音视频格式文件
|
||||
18. 支持 mp3,wav,mp4,flv 等音视频格式文件
|
||||
19. 支持 avi,mov,rm,webm,ts,rm,mkv,mpeg,ogg,mpg,rmvb,wmv,3gp,ts,swf 等视频格式转码预览
|
||||
|
||||
> 基于当前良好的架构模式,支持的文件类型在进一步丰富中
|
||||
### 项目特性
|
||||
@@ -34,7 +37,7 @@
|
||||
### 在线体验
|
||||
> 请善待公共服务,会不定时停用
|
||||
|
||||
地址:[https://kkview.cn/preview/index](https://kkview.cn/preview/index)
|
||||
地址:[https://file.kkview.cn](https://file.kkview.cn)
|
||||
|
||||
### 项目文档(Project documentation)
|
||||
1. 详细wiki文档:https://gitee.com/kekingcn/file-online-preview/wikis/pages
|
||||
@@ -44,7 +47,7 @@
|
||||
### 联系我们,加入组织
|
||||
> 我们会用心回答解决大家在项目使用中的问题,也请大家在提问前至少 Google 或 baidu 过,珍爱生命远离无效的交流沟通
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
### 文档预览效果
|
||||
@@ -275,7 +278,7 @@ epub 引用于 [ epub.js](https://github.com/futurepress/epub.js) 开源协议
|
||||
[](https://starchart.cc/kekingcn/kkFileView)
|
||||
|
||||
### 鸣谢
|
||||
- 本项目诞生于[凯京集团],在取得公司高层同意后以 Apache 协议开源出来反哺社区,在此特别感谢凯京集团,以及集团领导@唐老大的支持、@端木详笑的贡献。
|
||||
- 本项目诞生于[凯京集团],在取得公司高层同意后以 Apache 协议开源出来反哺社区,在此特别感谢凯京集团,以及集团领导[@唐老大](https://github.com/tangshd)的支持、@端木详笑的贡献。
|
||||
- 本项目已脱离公司由[KK开源社区]维护发展壮大,感谢所有给 kkFileView 提 Issue 、Pr 开发者
|
||||
- 本项目引入的第三方组件已在 '关于引用' 列表列出,感谢这些项目,让 kkFileView 更出色
|
||||
|
||||
|
||||
17
README.md
17
README.md
@@ -4,15 +4,17 @@
|
||||
|
||||
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`, etc.
|
||||
2. Supports domestic WPS Office documents such as `wps`, `dps`, et.
|
||||
1. Supports Office documents such as `doc`, `docx`, `xls`, `xlsx`, `xlsm`, `ppt`, `pptx`, `csv`, `tsv`, , `dotm`, `xlt`, `xltm`, `dot`, `xlam`, `dotx`, `xla,` 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`.
|
||||
5. Supports Windows system image files such as `wmf`, `emf`.
|
||||
6. Supports Photoshop software model files such as `psd`.
|
||||
7. Supports document formats like `pdf`, `ofd`, and `rtf`.
|
||||
8. Supports software model files like `xmind`.
|
||||
9. Supports document type files such as `eml`, `epub`.
|
||||
8. Supports software model files like `xmind`.
|
||||
9. Support for `bpmn` workflow files.
|
||||
9. Support for `eml` mail files
|
||||
10. Support for `epub` book documents
|
||||
10. Supports 3D model files like `obj`, `3ds`, `stl`, `ply`, `gltf`, `glb`, `off`, `3dm`, `fbx`, `dae`, `wrl`, `3mf`, `ifc`, `brep`, `step`, `iges`, `fcstd`, `bim`, etc.
|
||||
11. Supports CAD model files such as `dwg`, `dxf`.
|
||||
12. Supports all plain text files such as `txt`, `xml` (rendering), `md` (rendering), `java`, `php`, `py`, `js`, `css`, etc.
|
||||
@@ -37,7 +39,12 @@ URL:[https://kkview.cn](https://kkview.cn/)
|
||||
### Live demo
|
||||
> Please treat public service kindly, or this would stop at any time.
|
||||
|
||||
URL:[https://kkview.cn/preview/index](https://kkview.cn/preview/index)
|
||||
URL:[https://file.kkview.cn](https://file.kkview.cn)
|
||||
|
||||
### Contact Us
|
||||
> We will answer your questions carefully and solve any problems you encounter while using the project. We also kindly ask that you at least Google or Baidu before asking questions in order to save time and avoid ineffective communication. Let's cherish our lives and stay away from ineffective communication.
|
||||
|
||||
<img src="./doc/github星球.png/" width="50%">
|
||||
|
||||
### Quick Start
|
||||
> Technology stack
|
||||
|
||||
BIN
doc/gitee星球.png
Normal file
BIN
doc/gitee星球.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 92 KiB |
BIN
doc/github星球.png
Normal file
BIN
doc/github星球.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 148 KiB |
BIN
doc/知识星球.png
BIN
doc/知识星球.png
Binary file not shown.
|
Before Width: | Height: | Size: 30 KiB |
8
pom.xml
8
pom.xml
@@ -11,19 +11,19 @@
|
||||
<properties>
|
||||
<java.version>1.8</java.version>
|
||||
|
||||
<jodconverter.version>4.4.5</jodconverter.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.19</xstream.version>
|
||||
<junrar.version>7.4.1</junrar.version>
|
||||
<xstream.version>1.4.20</xstream.version>
|
||||
<junrar.version>7.5.4</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.26</pdfbox.version>
|
||||
<pdfbox.version>2.0.27</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>
|
||||
|
||||
@@ -43,6 +43,7 @@ public class WebConfig implements WebMvcConfigurer {
|
||||
Set<String> filterUri = new HashSet<>();
|
||||
filterUri.add("/onlinePreview");
|
||||
filterUri.add("/picturesPreview");
|
||||
filterUri.add("/getCorsFile");
|
||||
TrustHostFilter filter = new TrustHostFilter();
|
||||
FilterRegistrationBean<TrustHostFilter> registrationBean = new FilterRegistrationBean<>();
|
||||
registrationBean.setFilter(filter);
|
||||
@@ -67,6 +68,7 @@ public class WebConfig implements WebMvcConfigurer {
|
||||
public FilterRegistrationBean<BaseUrlFilter> getBaseUrlFilter() {
|
||||
Set<String> filterUri = new HashSet<>();
|
||||
filterUri.add("/index");
|
||||
filterUri.add("/");
|
||||
filterUri.add("/onlinePreview");
|
||||
filterUri.add("/picturesPreview");
|
||||
BaseUrlFilter filter = new BaseUrlFilter();
|
||||
@@ -80,6 +82,7 @@ public class WebConfig implements WebMvcConfigurer {
|
||||
public FilterRegistrationBean<AttributeSetFilter> getWatermarkConfigFilter() {
|
||||
Set<String> filterUri = new HashSet<>();
|
||||
filterUri.add("/index");
|
||||
filterUri.add("/");
|
||||
filterUri.add("/onlinePreview");
|
||||
filterUri.add("/picturesPreview");
|
||||
AttributeSetFilter filter = new AttributeSetFilter();
|
||||
|
||||
@@ -29,9 +29,10 @@ public enum FileType {
|
||||
Online3D("online3DFilePreviewImpl"),
|
||||
XMIND("xmindFilePreviewImpl"),
|
||||
SVG("svgFilePreviewImpl"),
|
||||
Epub("epubFilePreviewImpl");
|
||||
Epub("epubFilePreviewImpl"),
|
||||
BPMN("bpmnFilePreviewImpl");
|
||||
|
||||
private static final String[] OFFICE_TYPES = {"docx", "wps", "doc", "docm", "xls", "xlsx", "csv" ,"xlsm", "ppt", "pptx", "vsd", "rtf", "odt", "wmf", "emf", "dps", "et", "ods", "ots", "tsv", "odp", "otp", "sxi", "ott", "vsdx", "fodt", "fods", "xltx","tga","psd"};
|
||||
private static final String[] OFFICE_TYPES = {"docx", "wps", "doc", "docm", "xls", "xlsx", "csv" ,"xlsm", "ppt", "pptx", "vsd", "rtf", "odt", "wmf", "emf", "dps", "et", "ods", "ots", "tsv", "odp", "otp", "sxi", "ott", "vsdx", "fodt", "fods", "xltx","tga","psd","dotm","ett","xlt","xltm","wpt","dot","xlam","dotx","xla"};
|
||||
private static final String[] PICTURE_TYPES = {"jpg", "jpeg", "png", "gif", "bmp", "ico", "jfif", "webp"};
|
||||
private static final String[] ARCHIVE_TYPES = {"rar", "zip", "jar", "7-zip", "tar", "gzip", "7z"};
|
||||
private static final String[] Online3D_TYPES = {"obj", "3ds", "stl", "ply", "off", "3dm", "fbx", "dae", "wrl", "3mf", "ifc","glb","o3dv","gltf","stp","bim","fcstd","step","iges","brep"};
|
||||
@@ -98,6 +99,7 @@ public enum FileType {
|
||||
FILE_TYPE_MAPPER.put("xml", FileType.XML);
|
||||
FILE_TYPE_MAPPER.put("pdf", FileType.PDF);
|
||||
FILE_TYPE_MAPPER.put("flv", FileType.FLV);
|
||||
FILE_TYPE_MAPPER.put("bpmn", FileType.BPMN);
|
||||
}
|
||||
|
||||
private static FileType to(String fileType) {
|
||||
|
||||
@@ -4,13 +4,14 @@ import cn.keking.config.ConfigConstants;
|
||||
import cn.keking.model.FileAttribute;
|
||||
import cn.keking.model.FileType;
|
||||
import cn.keking.service.cache.CacheService;
|
||||
import cn.keking.service.cache.NotResourceCache;
|
||||
import cn.keking.utils.EncodingDetects;
|
||||
import cn.keking.utils.KkFileUtils;
|
||||
import cn.keking.utils.WebUtils;
|
||||
import com.aspose.cad.CodePages;
|
||||
import com.aspose.cad.Color;
|
||||
import com.aspose.cad.Image;
|
||||
import com.aspose.cad.LoadOptions;
|
||||
import com.aspose.cad.fileformats.cad.CadDrawTypeMode;
|
||||
import com.aspose.cad.imageoptions.CadRasterizationOptions;
|
||||
import com.aspose.cad.imageoptions.PdfOptions;
|
||||
import org.apache.pdfbox.pdmodel.PDDocument;
|
||||
@@ -40,8 +41,6 @@ import java.util.Map;
|
||||
public class FileHandlerService {
|
||||
|
||||
private final Logger logger = LoggerFactory.getLogger(FileHandlerService.class);
|
||||
|
||||
private static final String DEFAULT_CONVERTER_CHARSET = System.getProperty("sun.jnu.encoding");
|
||||
private final String fileDir = ConfigConstants.getFileDir();
|
||||
private final CacheService cacheService;
|
||||
|
||||
@@ -141,9 +140,10 @@ public class FileHandlerService {
|
||||
* @param outFilePath 文件绝对路径
|
||||
*/
|
||||
public void doActionConvertedFile(String outFilePath) {
|
||||
String charset = EncodingDetects.getJavaEncode(outFilePath);
|
||||
StringBuilder sb = new StringBuilder();
|
||||
try (InputStream inputStream = new FileInputStream(outFilePath);
|
||||
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, DEFAULT_CONVERTER_CHARSET))) {
|
||||
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, charset))) {
|
||||
String line;
|
||||
while (null != (line = reader.readLine())) {
|
||||
if (line.contains("charset=gb2312")) {
|
||||
@@ -198,6 +198,7 @@ public class FileHandlerService {
|
||||
return null;
|
||||
}
|
||||
PDDocument doc = PDDocument.load(pdfFile);
|
||||
doc.setResourceCache(new NotResourceCache());
|
||||
int pageCount = doc.getNumberOfPages();
|
||||
PDFRenderer pdfRenderer = new PDFRenderer(doc);
|
||||
|
||||
@@ -285,7 +286,7 @@ public class FileHandlerService {
|
||||
attribute.setSkipDownLoad(true);
|
||||
}
|
||||
url = WebUtils.encodeUrlFileName(url);
|
||||
fileName = KkFileUtils.htmlEscape(fileName); //文件名处理
|
||||
fileName = KkFileUtils.htmlEscape(fileName); //文件名处理
|
||||
attribute.setType(type);
|
||||
attribute.setName(fileName);
|
||||
attribute.setSuffix(suffix);
|
||||
|
||||
@@ -28,6 +28,7 @@ public interface FilePreview {
|
||||
String EXEL_FILE_PREVIEW_PAGE = "html";
|
||||
String XML_FILE_PREVIEW_PAGE = "xml";
|
||||
String MARKDOWN_FILE_PREVIEW_PAGE = "markdown";
|
||||
String BPMN_FILE_PREVIEW_PAGE = "bpmn";
|
||||
String NOT_SUPPORTED_FILE_PAGE = "fileNotSupported";
|
||||
|
||||
String filePreviewHandle(String url, Model model, FileAttribute fileAttribute);
|
||||
|
||||
20
server/src/main/java/cn/keking/service/cache/NotResourceCache.java
vendored
Normal file
20
server/src/main/java/cn/keking/service/cache/NotResourceCache.java
vendored
Normal file
@@ -0,0 +1,20 @@
|
||||
package cn.keking.service.cache;
|
||||
|
||||
import org.apache.pdfbox.cos.COSObject;
|
||||
import org.apache.pdfbox.pdmodel.DefaultResourceCache;
|
||||
import org.apache.pdfbox.pdmodel.graphics.PDXObject;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
/**
|
||||
* @author: Sawyer.Yong
|
||||
* @since: 2023/02/18 14:45
|
||||
* 解决图片 SoftReference 导致内存无法被回收导致的OOM, 详见 https://issues.apache.org/jira/browse/PDFBOX-3700
|
||||
*/
|
||||
public class NotResourceCache extends DefaultResourceCache {
|
||||
|
||||
@Override
|
||||
public void put(COSObject indirect, PDXObject xobject) throws IOException {
|
||||
// do nothing
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,27 @@
|
||||
package cn.keking.service.impl;
|
||||
|
||||
import cn.keking.model.FileAttribute;
|
||||
import cn.keking.service.FilePreview;
|
||||
import org.springframework.stereotype.Component;
|
||||
import org.springframework.ui.Model;
|
||||
|
||||
/**
|
||||
* @author kl (http://kailing.pub)
|
||||
* @since 2023/3/9
|
||||
*/
|
||||
@Component
|
||||
public class BpmnFilePreviewImpl implements FilePreview {
|
||||
|
||||
private final CommonPreviewImpl commonPreview;
|
||||
|
||||
public BpmnFilePreviewImpl(CommonPreviewImpl commonPreview) {
|
||||
this.commonPreview = commonPreview;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String filePreviewHandle(String url, Model model, FileAttribute fileAttribute) {
|
||||
commonPreview.filePreviewHandle(url,model,fileAttribute);
|
||||
model.addAttribute("fileName", fileAttribute.getName());
|
||||
return FilePreview.BPMN_FILE_PREVIEW_PAGE;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,48 @@
|
||||
package cn.keking.service.impl;
|
||||
|
||||
import cn.keking.model.FileAttribute;
|
||||
import cn.keking.model.ReturnResponse;
|
||||
import cn.keking.service.FileHandlerService;
|
||||
import cn.keking.service.FilePreview;
|
||||
import cn.keking.utils.DownloadUtils;
|
||||
import cn.keking.utils.KkFileUtils;
|
||||
import org.springframework.stereotype.Component;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.ui.Model;
|
||||
import org.springframework.util.CollectionUtils;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Created by kl on 2018/1/17.
|
||||
* Content :图片文件处理
|
||||
*/
|
||||
@Component("commonPreview")
|
||||
public class CommonPreviewImpl implements FilePreview {
|
||||
|
||||
private final FileHandlerService fileHandlerService;
|
||||
private final OtherFilePreviewImpl otherFilePreview;
|
||||
|
||||
public CommonPreviewImpl(FileHandlerService fileHandlerService, OtherFilePreviewImpl otherFilePreview) {
|
||||
this.fileHandlerService = fileHandlerService;
|
||||
this.otherFilePreview = otherFilePreview;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String filePreviewHandle(String url, Model model, FileAttribute fileAttribute) {
|
||||
// 不是http开头,浏览器不能直接访问,需下载到本地
|
||||
if (url != null && !url.toLowerCase().startsWith("http")) {
|
||||
ReturnResponse<String> response = DownloadUtils.downLoad(fileAttribute, null);
|
||||
if (response.isFailure()) {
|
||||
return otherFilePreview.notSupportedFile(model, fileAttribute, response.getMsg());
|
||||
} else {
|
||||
String file = fileHandlerService.getRelativePath(response.getContent());
|
||||
model.addAttribute("currentUrl", file);
|
||||
}
|
||||
} else {
|
||||
model.addAttribute("currentUrl", url);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
@@ -11,15 +11,15 @@ import org.springframework.ui.Model;
|
||||
@Service
|
||||
public class EmlFilePreviewImpl implements FilePreview {
|
||||
|
||||
private final PictureFilePreviewImpl pictureFilePreview;
|
||||
private final CommonPreviewImpl commonPreview;
|
||||
|
||||
public EmlFilePreviewImpl(PictureFilePreviewImpl pictureFilePreview) {
|
||||
this.pictureFilePreview = pictureFilePreview;
|
||||
public EmlFilePreviewImpl(CommonPreviewImpl commonPreview) {
|
||||
this.commonPreview = commonPreview;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String filePreviewHandle(String url, Model model, FileAttribute fileAttribute) {
|
||||
pictureFilePreview.filePreviewHandle(url,model,fileAttribute);
|
||||
commonPreview.filePreviewHandle(url,model,fileAttribute);
|
||||
return EML_FILE_PREVIEW_PAGE;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,15 +13,15 @@ import org.springframework.ui.Model;
|
||||
@Service
|
||||
public class EpubFilePreviewImpl implements FilePreview {
|
||||
|
||||
private final PictureFilePreviewImpl pictureFilePreview;
|
||||
private final CommonPreviewImpl commonPreview;
|
||||
|
||||
public EpubFilePreviewImpl(PictureFilePreviewImpl pictureFilePreview) {
|
||||
this.pictureFilePreview = pictureFilePreview;
|
||||
public EpubFilePreviewImpl(CommonPreviewImpl commonPreview) {
|
||||
this.commonPreview = commonPreview;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String filePreviewHandle(String url, Model model, FileAttribute fileAttribute) {
|
||||
pictureFilePreview.filePreviewHandle(url,model,fileAttribute);
|
||||
commonPreview.filePreviewHandle(url,model,fileAttribute);
|
||||
return EpubFilePreviewImpl;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,15 +13,15 @@ import org.springframework.ui.Model;
|
||||
@Service
|
||||
public class OfdFilePreviewImpl implements FilePreview {
|
||||
|
||||
private final PictureFilePreviewImpl pictureFilePreview;
|
||||
private final CommonPreviewImpl commonPreview;
|
||||
|
||||
public OfdFilePreviewImpl(PictureFilePreviewImpl pictureFilePreview) {
|
||||
this.pictureFilePreview = pictureFilePreview;
|
||||
public OfdFilePreviewImpl(CommonPreviewImpl commonPreview) {
|
||||
this.commonPreview = commonPreview;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String filePreviewHandle(String url, Model model, FileAttribute fileAttribute) {
|
||||
pictureFilePreview.filePreviewHandle(url,model,fileAttribute);
|
||||
commonPreview.filePreviewHandle(url,model,fileAttribute);
|
||||
return OFD_FILE_PREVIEW_PAGE;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -47,7 +47,7 @@ public class OfficeFilePreviewImpl implements FilePreview {
|
||||
String fileName = fileAttribute.getName();
|
||||
String filePassword = fileAttribute.getFilePassword();
|
||||
String userToken = fileAttribute.getUserToken();
|
||||
boolean isHtml = suffix.equalsIgnoreCase("xls") || suffix.equalsIgnoreCase("xlsx") || suffix.equalsIgnoreCase("csv");
|
||||
boolean isHtml = suffix.equalsIgnoreCase("xls") || suffix.equalsIgnoreCase("xlsx") || suffix.equalsIgnoreCase("csv") || suffix.equalsIgnoreCase("xlsm") || suffix.equalsIgnoreCase("xlt") || suffix.equalsIgnoreCase("xltm") || suffix.equalsIgnoreCase("et") || suffix.equalsIgnoreCase("ett") || suffix.equalsIgnoreCase("xlam");
|
||||
String pdfName = fileName.substring(0, fileName.lastIndexOf(".") + 1) + (isHtml ? "html" : "pdf");
|
||||
String cacheFileName = userToken == null ? pdfName : userToken + "_" + pdfName;
|
||||
String outFilePath = FILE_DIR + cacheFileName;
|
||||
|
||||
@@ -12,15 +12,15 @@ import org.springframework.ui.Model;
|
||||
@Service
|
||||
public class Online3DFilePreviewImpl implements FilePreview {
|
||||
|
||||
private final PictureFilePreviewImpl pictureFilePreview;
|
||||
private final CommonPreviewImpl commonPreview;
|
||||
|
||||
public Online3DFilePreviewImpl(PictureFilePreviewImpl pictureFilePreview) {
|
||||
this.pictureFilePreview = pictureFilePreview;
|
||||
public Online3DFilePreviewImpl(CommonPreviewImpl commonPreview) {
|
||||
this.commonPreview = commonPreview;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String filePreviewHandle(String url, Model model, FileAttribute fileAttribute) {
|
||||
pictureFilePreview.filePreviewHandle(url,model,fileAttribute);
|
||||
commonPreview.filePreviewHandle(url,model,fileAttribute);
|
||||
return Online3D_FILE_PAGE;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -18,12 +18,13 @@ import java.util.List;
|
||||
* Content :图片文件处理
|
||||
*/
|
||||
@Service
|
||||
public class PictureFilePreviewImpl implements FilePreview {
|
||||
public class PictureFilePreviewImpl extends CommonPreviewImpl {
|
||||
|
||||
private final FileHandlerService fileHandlerService;
|
||||
private final OtherFilePreviewImpl otherFilePreview;
|
||||
|
||||
public PictureFilePreviewImpl(FileHandlerService fileHandlerService, OtherFilePreviewImpl otherFilePreview) {
|
||||
super(fileHandlerService, otherFilePreview);
|
||||
this.fileHandlerService = fileHandlerService;
|
||||
this.otherFilePreview = otherFilePreview;
|
||||
}
|
||||
@@ -39,21 +40,8 @@ public class PictureFilePreviewImpl implements FilePreview {
|
||||
imgUrls.addAll(zipImgUrls);
|
||||
}
|
||||
// 不是http开头,浏览器不能直接访问,需下载到本地
|
||||
if (url != null && !url.toLowerCase().startsWith("http")) {
|
||||
ReturnResponse<String> response = DownloadUtils.downLoad(fileAttribute, null);
|
||||
if (response.isFailure()) {
|
||||
return otherFilePreview.notSupportedFile(model, fileAttribute, response.getMsg());
|
||||
} else {
|
||||
String file = fileHandlerService.getRelativePath(response.getContent());
|
||||
imgUrls.clear();
|
||||
imgUrls.add(file);
|
||||
model.addAttribute("imgUrls", imgUrls);
|
||||
model.addAttribute("currentUrl", file);
|
||||
}
|
||||
} else {
|
||||
model.addAttribute("imgUrls", imgUrls);
|
||||
model.addAttribute("currentUrl", url);
|
||||
}
|
||||
super.filePreviewHandle(url, model, fileAttribute);
|
||||
model.addAttribute("imgUrls", imgUrls);
|
||||
return PICTURE_FILE_PREVIEW_PAGE;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,15 +13,15 @@ import org.springframework.ui.Model;
|
||||
@Service
|
||||
public class SvgFilePreviewImpl implements FilePreview {
|
||||
|
||||
private final PictureFilePreviewImpl pictureFilePreview;
|
||||
private final CommonPreviewImpl commonPreview;
|
||||
|
||||
public SvgFilePreviewImpl(PictureFilePreviewImpl pictureFilePreview) {
|
||||
this.pictureFilePreview = pictureFilePreview;
|
||||
public SvgFilePreviewImpl(CommonPreviewImpl commonPreview) {
|
||||
this.commonPreview = commonPreview;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String filePreviewHandle(String url, Model model, FileAttribute fileAttribute) {
|
||||
pictureFilePreview.filePreviewHandle(url,model,fileAttribute);
|
||||
commonPreview.filePreviewHandle(url,model,fileAttribute);
|
||||
return SVG_FILE_PREVIEW_PAGE;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,15 +13,15 @@ import org.springframework.ui.Model;
|
||||
@Service
|
||||
public class XmindFilePreviewImpl implements FilePreview {
|
||||
|
||||
private final PictureFilePreviewImpl pictureFilePreview;
|
||||
private final CommonPreviewImpl commonPreview;
|
||||
|
||||
public XmindFilePreviewImpl(PictureFilePreviewImpl pictureFilePreview) {
|
||||
this.pictureFilePreview = pictureFilePreview;
|
||||
public XmindFilePreviewImpl(CommonPreviewImpl commonPreview) {
|
||||
this.commonPreview = commonPreview;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String filePreviewHandle(String url, Model model, FileAttribute fileAttribute) {
|
||||
pictureFilePreview.filePreviewHandle(url,model,fileAttribute);
|
||||
commonPreview.filePreviewHandle(url,model,fileAttribute);
|
||||
return XMIND_FILE_PREVIEW_PAGE;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -75,7 +75,7 @@ public class DownloadUtils {
|
||||
response.setMsg(fileName);
|
||||
return response;
|
||||
} catch (IOException | GalimatiasParseException e) {
|
||||
logger.error("文件下载失败,url:{}", urlStr, e);
|
||||
logger.error("文件下载失败,url:{}", urlStr);
|
||||
response.setCode(1);
|
||||
response.setContent(null);
|
||||
if (e instanceof FileNotFoundException) {
|
||||
|
||||
@@ -3,6 +3,8 @@ package cn.keking.utils;
|
||||
import io.mola.galimatias.GalimatiasParseException;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.springframework.util.Base64Utils;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
import org.springframework.web.util.HtmlUtils;
|
||||
|
||||
import javax.servlet.ServletRequest;
|
||||
import java.io.UnsupportedEncodingException;
|
||||
@@ -103,6 +105,30 @@ public class WebUtils {
|
||||
return noQueryUrl.substring(noQueryUrl.lastIndexOf("/") + 1);
|
||||
}
|
||||
|
||||
/**
|
||||
* 从url中剥离出文件名
|
||||
* @param file 文件
|
||||
* @return 文件名
|
||||
*/
|
||||
public static String getFileNameFromMultipartFile(MultipartFile file) {
|
||||
String fileName = file.getOriginalFilename();
|
||||
//判断是否为IE浏览器的文件名,IE浏览器下文件名会带有盘符信
|
||||
// escaping dangerous characters to prevent XSS
|
||||
assert fileName != null;
|
||||
fileName = HtmlUtils.htmlEscape(fileName, KkFileUtils.DEFAULT_FILE_ENCODING);
|
||||
|
||||
// Check for Unix-style path
|
||||
int unixSep = fileName.lastIndexOf('/');
|
||||
// Check for Windows-style path
|
||||
int winSep = fileName.lastIndexOf('\\');
|
||||
// Cut off at latest possible point
|
||||
int pos = (Math.max(winSep, unixSep));
|
||||
if (pos != -1) {
|
||||
fileName = fileName.substring(pos + 1);
|
||||
}
|
||||
return fileName;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 从url中获取文件后缀
|
||||
|
||||
@@ -6,22 +6,26 @@ import cn.keking.utils.KkFileUtils;
|
||||
import cn.keking.utils.WebUtils;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.util.ObjectUtils;
|
||||
import org.springframework.util.StreamUtils;
|
||||
import org.springframework.web.bind.annotation.GetMapping;
|
||||
import org.springframework.web.bind.annotation.PostMapping;
|
||||
import org.springframework.web.bind.annotation.RequestParam;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
import org.springframework.web.util.HtmlUtils;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.OutputStream;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Paths;
|
||||
import java.util.*;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
|
||||
/**
|
||||
* @author yudian-it
|
||||
@@ -36,50 +40,22 @@ public class FileController {
|
||||
private final String demoDir = "demo";
|
||||
private final String demoPath = demoDir + File.separator;
|
||||
public static final String BASE64_DECODE_ERROR_MSG = "Base64解码失败,请检查你的 %s 是否采用 Base64 + urlEncode 双重编码了!";
|
||||
private static final String[] not_allowed = { "dll", "exe", "msi" }; // 不允许上传的文件扩展名
|
||||
|
||||
@PostMapping("/fileUpload")
|
||||
public ReturnResponse<Object> fileUpload(@RequestParam("file") MultipartFile file) {
|
||||
if (ConfigConstants.getFileUploadDisable()) {
|
||||
return ReturnResponse.failure("文件传接口已禁用");
|
||||
}
|
||||
// 获取文件名
|
||||
String fileName = file.getOriginalFilename();
|
||||
//判断是否为IE浏览器的文件名,IE浏览器下文件名会带有盘符信息
|
||||
|
||||
// escaping dangerous characters to prevent XSS
|
||||
assert fileName != null;
|
||||
fileName = HtmlUtils.htmlEscape(fileName, StandardCharsets.UTF_8.name());
|
||||
|
||||
// Check for Unix-style path
|
||||
int unixSep = fileName.lastIndexOf('/');
|
||||
// Check for Windows-style path
|
||||
int winSep = fileName.lastIndexOf('\\');
|
||||
// Cut off at latest possible point
|
||||
int pos = (Math.max(winSep, unixSep));
|
||||
if (pos != -1) {
|
||||
fileName = fileName.substring(pos + 1);
|
||||
}
|
||||
String fileType= "";
|
||||
int i = fileName.lastIndexOf('.');
|
||||
if (i > 0) {
|
||||
fileType= fileName.substring(i+1);
|
||||
fileType= fileType.toLowerCase();
|
||||
}
|
||||
if (fileType.length() == 0 || fileType.equals("dll") || fileType.equals("exe") || fileType.equals("msi") ){
|
||||
return ReturnResponse.failure(fileName+"不允许上传的文件");
|
||||
}
|
||||
// 判断是否存在同名文件
|
||||
if (existsFile(fileName)) {
|
||||
return ReturnResponse.failure("存在同名文件,请先删除原有文件再次上传");
|
||||
ReturnResponse<Object> checkResult = this.fileUploadCheck(file);
|
||||
if (checkResult.isFailure()) {
|
||||
return checkResult;
|
||||
}
|
||||
File outFile = new File(fileDir + demoPath);
|
||||
if (!outFile.exists() && !outFile.mkdirs()) {
|
||||
logger.error("创建文件夹【{}】失败,请检查目录权限!", fileDir + demoPath);
|
||||
}
|
||||
logger.info("上传文件:{}", fileDir + demoPath + fileName);
|
||||
String fileName = checkResult.getContent().toString();
|
||||
logger.info("上传文件:{}{}{}", fileDir, demoPath, fileName);
|
||||
try (InputStream in = file.getInputStream(); OutputStream out = Files.newOutputStream(Paths.get(fileDir + demoPath + fileName))) {
|
||||
StreamUtils.copy(in, out);
|
||||
in.close();
|
||||
out.close();
|
||||
return ReturnResponse.success(null);
|
||||
} catch (IOException e) {
|
||||
logger.error("文件上传失败", e);
|
||||
@@ -89,21 +65,11 @@ public class FileController {
|
||||
|
||||
@GetMapping("/deleteFile")
|
||||
public ReturnResponse<Object> deleteFile(String fileName) {
|
||||
if (fileName == null || fileName.length() == 0) {
|
||||
return ReturnResponse.failure("文件名为空,删除失败!");
|
||||
}
|
||||
try {
|
||||
fileName = WebUtils.decodeUrl(fileName);
|
||||
} catch (Exception ex) {
|
||||
String errorMsg = String.format(BASE64_DECODE_ERROR_MSG, "url");
|
||||
return ReturnResponse.failure(errorMsg+"删除失败!");
|
||||
}
|
||||
if (fileName.contains("/")) {
|
||||
fileName = fileName.substring(fileName.lastIndexOf("/") + 1);
|
||||
}
|
||||
if (KkFileUtils.isIllegalFileName(fileName)) {
|
||||
return ReturnResponse.failure("非法文件名,删除失败!");
|
||||
ReturnResponse<Object> checkResult = this.deleteFileCheck(fileName);
|
||||
if (checkResult.isFailure()) {
|
||||
return checkResult;
|
||||
}
|
||||
fileName = checkResult.getContent().toString();
|
||||
File file = new File(fileDir + demoPath + fileName);
|
||||
logger.info("删除文件:{}", file.getAbsolutePath());
|
||||
if (file.exists() && !file.delete()) {
|
||||
@@ -119,7 +85,9 @@ public class FileController {
|
||||
List<Map<String, String>> list = new ArrayList<>();
|
||||
File file = new File(fileDir + demoPath);
|
||||
if (file.exists()) {
|
||||
Arrays.stream(Objects.requireNonNull(file.listFiles())).forEach(file1 -> {
|
||||
File[] files = Objects.requireNonNull(file.listFiles());
|
||||
Arrays.sort(files, (f1, f2) -> Long.compare(f2.lastModified(), f1.lastModified()));
|
||||
Arrays.stream(files).forEach(file1 -> {
|
||||
Map<String, String> fileName = new HashMap<>();
|
||||
fileName.put("fileName", demoDir + "/" + file1.getName());
|
||||
list.add(fileName);
|
||||
@@ -128,6 +96,72 @@ public class FileController {
|
||||
return list;
|
||||
}
|
||||
|
||||
/**
|
||||
* 上传文件前校验
|
||||
*
|
||||
* @param file 文件
|
||||
* @return 校验结果
|
||||
*/
|
||||
private ReturnResponse<Object> fileUploadCheck(MultipartFile file) {
|
||||
if (ConfigConstants.getFileUploadDisable()) {
|
||||
return ReturnResponse.failure("文件传接口已禁用");
|
||||
}
|
||||
String fileName = WebUtils.getFileNameFromMultipartFile(file);
|
||||
|
||||
if (!isAllowedUpload(fileName)) {
|
||||
return ReturnResponse.failure("不允许上传的文件类型: " + fileName);
|
||||
}
|
||||
if (KkFileUtils.isIllegalFileName(fileName)) {
|
||||
return ReturnResponse.failure("不允许上传的文件名: " + fileName);
|
||||
}
|
||||
// 判断是否存在同名文件
|
||||
if (existsFile(fileName)) {
|
||||
return ReturnResponse.failure("存在同名文件,请先删除原有文件再次上传");
|
||||
}
|
||||
return ReturnResponse.success(fileName);
|
||||
}
|
||||
|
||||
/**
|
||||
* 判断文件是否允许上传
|
||||
*
|
||||
* @param file 文件扩展名
|
||||
* @return 是否允许上传
|
||||
*/
|
||||
private boolean isAllowedUpload(String file) {
|
||||
String fileType = KkFileUtils.suffixFromFileName(file);
|
||||
for (String type : not_allowed) {
|
||||
if (type.equals(fileType))
|
||||
return false;
|
||||
}
|
||||
return !ObjectUtils.isEmpty(fileType);
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除文件前校验
|
||||
*
|
||||
* @param fileName 文件名
|
||||
* @return 校验结果
|
||||
*/
|
||||
private ReturnResponse<Object> deleteFileCheck(String fileName) {
|
||||
if (ObjectUtils.isEmpty(fileName)) {
|
||||
return ReturnResponse.failure("文件名为空,删除失败!");
|
||||
}
|
||||
try {
|
||||
fileName = WebUtils.decodeUrl(fileName);
|
||||
} catch (Exception ex) {
|
||||
String errorMsg = String.format(BASE64_DECODE_ERROR_MSG, fileName);
|
||||
return ReturnResponse.failure(errorMsg + "删除失败!");
|
||||
}
|
||||
assert fileName != null;
|
||||
if (fileName.contains("/")) {
|
||||
fileName = fileName.substring(fileName.lastIndexOf("/") + 1);
|
||||
}
|
||||
if (KkFileUtils.isIllegalFileName(fileName)) {
|
||||
return ReturnResponse.failure("非法文件名,删除失败!");
|
||||
}
|
||||
return ReturnResponse.success(fileName);
|
||||
}
|
||||
|
||||
private boolean existsFile(String fileName) {
|
||||
File file = new File(fileDir + demoPath + fileName);
|
||||
return file.exists();
|
||||
|
||||
@@ -13,21 +13,28 @@ public class IndexController {
|
||||
|
||||
@GetMapping( "/index")
|
||||
public String go2Index(){
|
||||
return "index";
|
||||
return "/main/index";
|
||||
}
|
||||
|
||||
@GetMapping( "/record")
|
||||
public String go2Record(){
|
||||
return "record";
|
||||
return "/main/record";
|
||||
}
|
||||
|
||||
@GetMapping( "/comment")
|
||||
public String go2Comment(){
|
||||
return "comment";
|
||||
@GetMapping( "/sponsor")
|
||||
public String go2Sponsor(){
|
||||
return "/main/sponsor";
|
||||
}
|
||||
|
||||
@GetMapping( "/integrated")
|
||||
public String go2Integrated(){
|
||||
return "/main/integrated";
|
||||
}
|
||||
|
||||
@GetMapping( "/")
|
||||
public String root() {
|
||||
return "redirect:/index";
|
||||
return "/main/index";
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -42,7 +42,9 @@ public class TrustHostFilter implements Filter {
|
||||
response.getWriter().write(html);
|
||||
response.getWriter().close();
|
||||
}
|
||||
chain.doFilter(request, response);
|
||||
else {
|
||||
chain.doFilter(request, response);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
144
server/src/main/resources/static/bpmn/bpmn-js.css
Normal file
144
server/src/main/resources/static/bpmn/bpmn-js.css
Normal file
@@ -0,0 +1,144 @@
|
||||
.bjs-container {
|
||||
--bjs-font-family: Arial, sans-serif;
|
||||
|
||||
--color-grey-225-10-15: hsl(225, 10%, 15%);
|
||||
--color-grey-225-10-35: hsl(225, 10%, 35%);
|
||||
--color-grey-225-10-55: hsl(225, 10%, 55%);
|
||||
--color-grey-225-10-75: hsl(225, 10%, 75%);
|
||||
--color-grey-225-10-80: hsl(225, 10%, 80%);
|
||||
--color-grey-225-10-85: hsl(225, 10%, 85%);
|
||||
--color-grey-225-10-90: hsl(225, 10%, 90%);
|
||||
--color-grey-225-10-95: hsl(225, 10%, 95%);
|
||||
--color-grey-225-10-97: hsl(225, 10%, 97%);
|
||||
|
||||
--color-blue-205-100-45: hsl(205, 100%, 45%);
|
||||
--color-blue-205-100-45-opacity-30: hsla(205, 100%, 45%, 30%);
|
||||
--color-blue-205-100-50: hsl(205, 100%, 50%);
|
||||
--color-blue-205-100-95: hsl(205, 100%, 95%);
|
||||
|
||||
--color-green-150-86-44: hsl(150, 86%, 44%);
|
||||
|
||||
--color-red-360-100-40: hsl(360, 100%, 40%);
|
||||
--color-red-360-100-45: hsl(360, 100%, 45%);
|
||||
--color-red-360-100-92: hsl(360, 100%, 92%);
|
||||
--color-red-360-100-97: hsl(360, 100%, 97%);
|
||||
|
||||
--color-white: hsl(0, 0%, 100%);
|
||||
--color-black: hsl(0, 0%, 0%);
|
||||
--color-black-opacity-05: hsla(0, 0%, 0%, 5%);
|
||||
--color-black-opacity-10: hsla(0, 0%, 0%, 10%);
|
||||
|
||||
--breadcrumbs-font-family: var(--bjs-font-family);
|
||||
--breadcrumbs-item-color: var(--color-blue-205-100-50);
|
||||
--breadcrumbs-arrow-color: var(--color-black);
|
||||
--drilldown-fill-color: var(--color-white);
|
||||
--drilldown-background-color: var(--color-blue-205-100-50);
|
||||
}
|
||||
|
||||
.bjs-breadcrumbs {
|
||||
position: absolute;
|
||||
display: none;
|
||||
flex-wrap: wrap;
|
||||
align-items: center;
|
||||
top: 30px;
|
||||
left: 30px;
|
||||
padding: 0px;
|
||||
margin: 0px;
|
||||
font-family: var(--breadcrumbs-font-family);
|
||||
font-size: 16px;
|
||||
line-height: normal;
|
||||
}
|
||||
|
||||
.bjs-breadcrumbs-shown .bjs-breadcrumbs {
|
||||
display: flex;
|
||||
}
|
||||
|
||||
.djs-palette-shown .bjs-breadcrumbs {
|
||||
left: 90px;
|
||||
}
|
||||
|
||||
.djs-palette-shown.djs-palette-two-column .bjs-breadcrumbs {
|
||||
left: 140px;
|
||||
}
|
||||
|
||||
.bjs-breadcrumbs li {
|
||||
display: inline-flex;
|
||||
padding-bottom: 5px;
|
||||
}
|
||||
|
||||
.bjs-breadcrumbs li a {
|
||||
cursor: pointer;
|
||||
color: var(--breadcrumbs-item-color);
|
||||
}
|
||||
|
||||
.bjs-breadcrumbs li:last-of-type a {
|
||||
color: inherit;
|
||||
cursor: default;
|
||||
}
|
||||
|
||||
.bjs-breadcrumbs li:not(:first-child)::before {
|
||||
content: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="17" height="17" viewBox="0 0 24 24"><path d="M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z" /><path d="M0 0h24v24H0z" fill="none" /></svg>');
|
||||
padding: 0 8px;
|
||||
color: var(--breadcrumbs-arrow-color);
|
||||
height: 1em;
|
||||
}
|
||||
|
||||
.bjs-breadcrumbs .bjs-crumb {
|
||||
display: inline-block;
|
||||
max-width: 200px;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.bjs-drilldown {
|
||||
width: 20px;
|
||||
height: 20px;
|
||||
|
||||
padding: 0px;
|
||||
margin-left: -20px;
|
||||
|
||||
cursor: pointer;
|
||||
border: none;
|
||||
border-radius: 2px;
|
||||
outline: none;
|
||||
|
||||
fill: var(--drilldown-fill-color);
|
||||
background-color: var(--drilldown-background-color);
|
||||
}
|
||||
|
||||
.bjs-drilldown-empty {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.selected .bjs-drilldown-empty {
|
||||
display: inherit;
|
||||
}
|
||||
|
||||
[data-popup="align-elements"] .djs-popup-results {
|
||||
display: flex;
|
||||
}
|
||||
|
||||
[data-popup="align-elements"] .djs-popup-body [data-group] + [data-group] {
|
||||
border-left: 1px solid var(--popup-border-color);
|
||||
}
|
||||
|
||||
[data-popup="align-elements"] [data-group="align"] {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(3, 1fr);
|
||||
}
|
||||
|
||||
[data-popup="align-elements"] .djs-popup-body .entry {
|
||||
padding: 6px 8px;
|
||||
}
|
||||
|
||||
[data-popup="align-elements"] .djs-popup-body .entry:not(:first-child) {
|
||||
margin-top: 0;
|
||||
}
|
||||
|
||||
[data-popup="align-elements"] .djs-popup-entry-icon {
|
||||
display: block;
|
||||
margin: 0;
|
||||
height: 20px;
|
||||
width: 20px;
|
||||
}
|
||||
62804
server/src/main/resources/static/bpmn/bpmn-modeler.development.js
Normal file
62804
server/src/main/resources/static/bpmn/bpmn-modeler.development.js
Normal file
File diff suppressed because one or more lines are too long
163
server/src/main/resources/static/bpmn/bpmn.css
Normal file
163
server/src/main/resources/static/bpmn/bpmn.css
Normal file
@@ -0,0 +1,163 @@
|
||||
@font-face {
|
||||
font-family: 'bpmn';
|
||||
src: url('../font/bpmn.eot?21877404');
|
||||
src: url('../font/bpmn.eot?21877404#iefix') format('embedded-opentype'),
|
||||
url('../font/bpmn.woff2?21877404') format('woff2'),
|
||||
url('../font/bpmn.woff?21877404') format('woff'),
|
||||
url('../font/bpmn.ttf?21877404') format('truetype'),
|
||||
url('../font/bpmn.svg?21877404#bpmn') format('svg');
|
||||
font-weight: normal;
|
||||
font-style: normal;
|
||||
}
|
||||
/* Chrome hack: SVG is rendered more smooth in Windozze. 100% magic, uncomment if you need it. */
|
||||
/* Note, that will break hinting! In other OS-es font will be not as sharp as it could be */
|
||||
/*
|
||||
@media screen and (-webkit-min-device-pixel-ratio:0) {
|
||||
@font-face {
|
||||
font-family: 'bpmn';
|
||||
src: url('../font/bpmn.svg?21877404#bpmn') format('svg');
|
||||
}
|
||||
}
|
||||
*/
|
||||
[class^="bpmn-icon-"]:before, [class*=" bpmn-icon-"]:before {
|
||||
font-family: "bpmn";
|
||||
font-style: normal;
|
||||
font-weight: normal;
|
||||
speak: never;
|
||||
|
||||
display: inline-block;
|
||||
text-decoration: inherit;
|
||||
width: 1em;
|
||||
/* margin-right: .2em; */
|
||||
text-align: center;
|
||||
/* opacity: .8; */
|
||||
|
||||
/* For safety - reset parent styles, that can break glyph codes*/
|
||||
font-variant: normal;
|
||||
text-transform: none;
|
||||
|
||||
/* fix buttons height, for twitter bootstrap */
|
||||
line-height: 1em;
|
||||
|
||||
/* Animation center compensation - margins should be symmetric */
|
||||
/* remove if not needed */
|
||||
/* margin-left: .2em; */
|
||||
|
||||
/* you can be more comfortable with increased icons size */
|
||||
/* font-size: 120%; */
|
||||
|
||||
/* Font smoothing. That was taken from TWBS */
|
||||
-webkit-font-smoothing: antialiased;
|
||||
-moz-osx-font-smoothing: grayscale;
|
||||
|
||||
/* Uncomment for 3D effect */
|
||||
/* text-shadow: 1px 1px 1px rgba(127, 127, 127, 0.3); */
|
||||
}
|
||||
|
||||
.bpmn-icon-trash:before { content: '\e801'; } /* '' */
|
||||
.bpmn-icon-gateway-parallel:before { content: '\e804'; } /* '' */
|
||||
.bpmn-icon-intermediate-event-catch-cancel:before { content: '\e805'; } /* '' */
|
||||
.bpmn-icon-intermediate-event-catch-non-interrupting-message:before { content: '\e806'; } /* '' */
|
||||
.bpmn-icon-start-event-compensation:before { content: '\e807'; } /* '' */
|
||||
.bpmn-icon-start-event-non-interrupting-parallel-multiple:before { content: '\e808'; } /* '' */
|
||||
.bpmn-icon-loop-marker:before { content: '\e809'; } /* '' */
|
||||
.bpmn-icon-parallel-mi-marker:before { content: '\e80a'; } /* '' */
|
||||
.bpmn-icon-start-event-non-interrupting-signal:before { content: '\e80b'; } /* '' */
|
||||
.bpmn-icon-intermediate-event-catch-non-interrupting-timer:before { content: '\e80c'; } /* '' */
|
||||
.bpmn-icon-intermediate-event-catch-parallel-multiple:before { content: '\e80d'; } /* '' */
|
||||
.bpmn-icon-intermediate-event-catch-compensation:before { content: '\e80e'; } /* '' */
|
||||
.bpmn-icon-gateway-xor:before { content: '\e80f'; } /* '' */
|
||||
.bpmn-icon-end-event-cancel:before { content: '\e811'; } /* '' */
|
||||
.bpmn-icon-intermediate-event-catch-condition:before { content: '\e812'; } /* '' */
|
||||
.bpmn-icon-intermediate-event-catch-non-interrupting-parallel-multiple:before { content: '\e813'; } /* '' */
|
||||
.bpmn-icon-start-event-condition:before { content: '\e814'; } /* '' */
|
||||
.bpmn-icon-start-event-non-interrupting-timer:before { content: '\e815'; } /* '' */
|
||||
.bpmn-icon-sequential-mi-marker:before { content: '\e816'; } /* '' */
|
||||
.bpmn-icon-user-task:before { content: '\e817'; } /* '' */
|
||||
.bpmn-icon-business-rule:before { content: '\e818'; } /* '' */
|
||||
.bpmn-icon-sub-process-marker:before { content: '\e819'; } /* '' */
|
||||
.bpmn-icon-start-event-parallel-multiple:before { content: '\e81a'; } /* '' */
|
||||
.bpmn-icon-start-event-error:before { content: '\e81b'; } /* '' */
|
||||
.bpmn-icon-intermediate-event-catch-signal:before { content: '\e81c'; } /* '' */
|
||||
.bpmn-icon-intermediate-event-catch-error:before { content: '\e81d'; } /* '' */
|
||||
.bpmn-icon-end-event-compensation:before { content: '\e81e'; } /* '' */
|
||||
.bpmn-icon-subprocess-collapsed:before { content: '\e81f'; } /* '' */
|
||||
.bpmn-icon-subprocess-expanded:before { content: '\e820'; } /* '' */
|
||||
.bpmn-icon-task:before { content: '\e821'; } /* '' */
|
||||
.bpmn-icon-end-event-error:before { content: '\e822'; } /* '' */
|
||||
.bpmn-icon-intermediate-event-catch-escalation:before { content: '\e823'; } /* '' */
|
||||
.bpmn-icon-intermediate-event-catch-timer:before { content: '\e824'; } /* '' */
|
||||
.bpmn-icon-start-event-escalation:before { content: '\e825'; } /* '' */
|
||||
.bpmn-icon-start-event-signal:before { content: '\e826'; } /* '' */
|
||||
.bpmn-icon-business-rule-task:before { content: '\e827'; } /* '' */
|
||||
.bpmn-icon-manual:before { content: '\e828'; } /* '' */
|
||||
.bpmn-icon-receive:before { content: '\e829'; } /* '' */
|
||||
.bpmn-icon-call-activity:before { content: '\e82a'; } /* '' */
|
||||
.bpmn-icon-start-event-timer:before { content: '\e82b'; } /* '' */
|
||||
.bpmn-icon-start-event-message:before { content: '\e82c'; } /* '' */
|
||||
.bpmn-icon-intermediate-event-none:before { content: '\e82d'; } /* '' */
|
||||
.bpmn-icon-intermediate-event-catch-link:before { content: '\e82e'; } /* '' */
|
||||
.bpmn-icon-end-event-escalation:before { content: '\e82f'; } /* '' */
|
||||
.bpmn-icon-bpmn-io:before { content: '\e831'; } /* '' */
|
||||
.bpmn-icon-gateway-complex:before { content: '\e832'; } /* '' */
|
||||
.bpmn-icon-gateway-eventbased:before { content: '\e833'; } /* '' */
|
||||
.bpmn-icon-gateway-none:before { content: '\e834'; } /* '' */
|
||||
.bpmn-icon-gateway-or:before { content: '\e835'; } /* '' */
|
||||
.bpmn-icon-end-event-terminate:before { content: '\e836'; } /* '' */
|
||||
.bpmn-icon-end-event-signal:before { content: '\e837'; } /* '' */
|
||||
.bpmn-icon-end-event-none:before { content: '\e838'; } /* '' */
|
||||
.bpmn-icon-end-event-multiple:before { content: '\e839'; } /* '' */
|
||||
.bpmn-icon-end-event-message:before { content: '\e83a'; } /* '' */
|
||||
.bpmn-icon-end-event-link:before { content: '\e83b'; } /* '' */
|
||||
.bpmn-icon-intermediate-event-catch-message:before { content: '\e83c'; } /* '' */
|
||||
.bpmn-icon-intermediate-event-throw-compensation:before { content: '\e83d'; } /* '' */
|
||||
.bpmn-icon-start-event-multiple:before { content: '\e83e'; } /* '' */
|
||||
.bpmn-icon-script:before { content: '\e83f'; } /* '' */
|
||||
.bpmn-icon-manual-task:before { content: '\e840'; } /* '' */
|
||||
.bpmn-icon-send:before { content: '\e841'; } /* '' */
|
||||
.bpmn-icon-service:before { content: '\e842'; } /* '' */
|
||||
.bpmn-icon-receive-task:before { content: '\e843'; } /* '' */
|
||||
.bpmn-icon-user:before { content: '\e844'; } /* '' */
|
||||
.bpmn-icon-start-event-none:before { content: '\e845'; } /* '' */
|
||||
.bpmn-icon-intermediate-event-throw-escalation:before { content: '\e846'; } /* '' */
|
||||
.bpmn-icon-intermediate-event-catch-multiple:before { content: '\e847'; } /* '' */
|
||||
.bpmn-icon-intermediate-event-catch-non-interrupting-escalation:before { content: '\e848'; } /* '' */
|
||||
.bpmn-icon-intermediate-event-throw-link:before { content: '\e849'; } /* '' */
|
||||
.bpmn-icon-start-event-non-interrupting-condition:before { content: '\e84a'; } /* '' */
|
||||
.bpmn-icon-data-object:before { content: '\e84b'; } /* '' */
|
||||
.bpmn-icon-script-task:before { content: '\e84c'; } /* '' */
|
||||
.bpmn-icon-send-task:before { content: '\e84d'; } /* '' */
|
||||
.bpmn-icon-data-store:before { content: '\e84e'; } /* '' */
|
||||
.bpmn-icon-start-event-non-interrupting-escalation:before { content: '\e84f'; } /* '' */
|
||||
.bpmn-icon-intermediate-event-throw-message:before { content: '\e850'; } /* '' */
|
||||
.bpmn-icon-intermediate-event-catch-non-interrupting-multiple:before { content: '\e851'; } /* '' */
|
||||
.bpmn-icon-intermediate-event-catch-non-interrupting-signal:before { content: '\e852'; } /* '' */
|
||||
.bpmn-icon-intermediate-event-throw-multiple:before { content: '\e853'; } /* '' */
|
||||
.bpmn-icon-start-event-non-interrupting-message:before { content: '\e854'; } /* '' */
|
||||
.bpmn-icon-ad-hoc-marker:before { content: '\e855'; } /* '' */
|
||||
.bpmn-icon-service-task:before { content: '\e856'; } /* '' */
|
||||
.bpmn-icon-task-none:before { content: '\e857'; } /* '' */
|
||||
.bpmn-icon-compensation-marker:before { content: '\e858'; } /* '' */
|
||||
.bpmn-icon-start-event-non-interrupting-multiple:before { content: '\e859'; } /* '' */
|
||||
.bpmn-icon-intermediate-event-throw-signal:before { content: '\e85a'; } /* '' */
|
||||
.bpmn-icon-intermediate-event-catch-non-interrupting-condition:before { content: '\e85b'; } /* '' */
|
||||
.bpmn-icon-participant:before { content: '\e85c'; } /* '' */
|
||||
.bpmn-icon-event-subprocess-expanded:before { content: '\e85d'; } /* '' */
|
||||
.bpmn-icon-lane-insert-below:before { content: '\e85e'; } /* '' */
|
||||
.bpmn-icon-space-tool:before { content: '\e85f'; } /* '' */
|
||||
.bpmn-icon-connection-multi:before { content: '\e860'; } /* '' */
|
||||
.bpmn-icon-lane:before { content: '\e861'; } /* '' */
|
||||
.bpmn-icon-lasso-tool:before { content: '\e862'; } /* '' */
|
||||
.bpmn-icon-lane-insert-above:before { content: '\e863'; } /* '' */
|
||||
.bpmn-icon-lane-divide-three:before { content: '\e864'; } /* '' */
|
||||
.bpmn-icon-lane-divide-two:before { content: '\e865'; } /* '' */
|
||||
.bpmn-icon-data-input:before { content: '\e866'; } /* '' */
|
||||
.bpmn-icon-data-output:before { content: '\e867'; } /* '' */
|
||||
.bpmn-icon-hand-tool:before { content: '\e868'; } /* '' */
|
||||
.bpmn-icon-group:before { content: '\e869'; } /* '' */
|
||||
.bpmn-icon-text-annotation:before { content: '\e86b'; } /* '' */
|
||||
.bpmn-icon-transaction:before { content: '\e8c4'; } /* '' */
|
||||
.bpmn-icon-screw-wrench:before { content: '\e8db'; } /* '' */
|
||||
.bpmn-icon-connection:before { content: '\e8dc'; } /* '' */
|
||||
.bpmn-icon-conditional-flow:before { content: '\e8e0'; } /* '' */
|
||||
.bpmn-icon-default-flow:before { content: '\e8e1'; } /* '' */
|
||||
108
server/src/main/resources/static/bpmn/css/bpmn-codes.css
Normal file
108
server/src/main/resources/static/bpmn/css/bpmn-codes.css
Normal file
@@ -0,0 +1,108 @@
|
||||
|
||||
.bpmn-icon-trash:before { content: '\e801'; } /* '' */
|
||||
.bpmn-icon-gateway-parallel:before { content: '\e804'; } /* '' */
|
||||
.bpmn-icon-intermediate-event-catch-cancel:before { content: '\e805'; } /* '' */
|
||||
.bpmn-icon-intermediate-event-catch-non-interrupting-message:before { content: '\e806'; } /* '' */
|
||||
.bpmn-icon-start-event-compensation:before { content: '\e807'; } /* '' */
|
||||
.bpmn-icon-start-event-non-interrupting-parallel-multiple:before { content: '\e808'; } /* '' */
|
||||
.bpmn-icon-loop-marker:before { content: '\e809'; } /* '' */
|
||||
.bpmn-icon-parallel-mi-marker:before { content: '\e80a'; } /* '' */
|
||||
.bpmn-icon-start-event-non-interrupting-signal:before { content: '\e80b'; } /* '' */
|
||||
.bpmn-icon-intermediate-event-catch-non-interrupting-timer:before { content: '\e80c'; } /* '' */
|
||||
.bpmn-icon-intermediate-event-catch-parallel-multiple:before { content: '\e80d'; } /* '' */
|
||||
.bpmn-icon-intermediate-event-catch-compensation:before { content: '\e80e'; } /* '' */
|
||||
.bpmn-icon-gateway-xor:before { content: '\e80f'; } /* '' */
|
||||
.bpmn-icon-end-event-cancel:before { content: '\e811'; } /* '' */
|
||||
.bpmn-icon-intermediate-event-catch-condition:before { content: '\e812'; } /* '' */
|
||||
.bpmn-icon-intermediate-event-catch-non-interrupting-parallel-multiple:before { content: '\e813'; } /* '' */
|
||||
.bpmn-icon-start-event-condition:before { content: '\e814'; } /* '' */
|
||||
.bpmn-icon-start-event-non-interrupting-timer:before { content: '\e815'; } /* '' */
|
||||
.bpmn-icon-sequential-mi-marker:before { content: '\e816'; } /* '' */
|
||||
.bpmn-icon-user-task:before { content: '\e817'; } /* '' */
|
||||
.bpmn-icon-business-rule:before { content: '\e818'; } /* '' */
|
||||
.bpmn-icon-sub-process-marker:before { content: '\e819'; } /* '' */
|
||||
.bpmn-icon-start-event-parallel-multiple:before { content: '\e81a'; } /* '' */
|
||||
.bpmn-icon-start-event-error:before { content: '\e81b'; } /* '' */
|
||||
.bpmn-icon-intermediate-event-catch-signal:before { content: '\e81c'; } /* '' */
|
||||
.bpmn-icon-intermediate-event-catch-error:before { content: '\e81d'; } /* '' */
|
||||
.bpmn-icon-end-event-compensation:before { content: '\e81e'; } /* '' */
|
||||
.bpmn-icon-subprocess-collapsed:before { content: '\e81f'; } /* '' */
|
||||
.bpmn-icon-subprocess-expanded:before { content: '\e820'; } /* '' */
|
||||
.bpmn-icon-task:before { content: '\e821'; } /* '' */
|
||||
.bpmn-icon-end-event-error:before { content: '\e822'; } /* '' */
|
||||
.bpmn-icon-intermediate-event-catch-escalation:before { content: '\e823'; } /* '' */
|
||||
.bpmn-icon-intermediate-event-catch-timer:before { content: '\e824'; } /* '' */
|
||||
.bpmn-icon-start-event-escalation:before { content: '\e825'; } /* '' */
|
||||
.bpmn-icon-start-event-signal:before { content: '\e826'; } /* '' */
|
||||
.bpmn-icon-business-rule-task:before { content: '\e827'; } /* '' */
|
||||
.bpmn-icon-manual:before { content: '\e828'; } /* '' */
|
||||
.bpmn-icon-receive:before { content: '\e829'; } /* '' */
|
||||
.bpmn-icon-call-activity:before { content: '\e82a'; } /* '' */
|
||||
.bpmn-icon-start-event-timer:before { content: '\e82b'; } /* '' */
|
||||
.bpmn-icon-start-event-message:before { content: '\e82c'; } /* '' */
|
||||
.bpmn-icon-intermediate-event-none:before { content: '\e82d'; } /* '' */
|
||||
.bpmn-icon-intermediate-event-catch-link:before { content: '\e82e'; } /* '' */
|
||||
.bpmn-icon-end-event-escalation:before { content: '\e82f'; } /* '' */
|
||||
.bpmn-icon-bpmn-io:before { content: '\e831'; } /* '' */
|
||||
.bpmn-icon-gateway-complex:before { content: '\e832'; } /* '' */
|
||||
.bpmn-icon-gateway-eventbased:before { content: '\e833'; } /* '' */
|
||||
.bpmn-icon-gateway-none:before { content: '\e834'; } /* '' */
|
||||
.bpmn-icon-gateway-or:before { content: '\e835'; } /* '' */
|
||||
.bpmn-icon-end-event-terminate:before { content: '\e836'; } /* '' */
|
||||
.bpmn-icon-end-event-signal:before { content: '\e837'; } /* '' */
|
||||
.bpmn-icon-end-event-none:before { content: '\e838'; } /* '' */
|
||||
.bpmn-icon-end-event-multiple:before { content: '\e839'; } /* '' */
|
||||
.bpmn-icon-end-event-message:before { content: '\e83a'; } /* '' */
|
||||
.bpmn-icon-end-event-link:before { content: '\e83b'; } /* '' */
|
||||
.bpmn-icon-intermediate-event-catch-message:before { content: '\e83c'; } /* '' */
|
||||
.bpmn-icon-intermediate-event-throw-compensation:before { content: '\e83d'; } /* '' */
|
||||
.bpmn-icon-start-event-multiple:before { content: '\e83e'; } /* '' */
|
||||
.bpmn-icon-script:before { content: '\e83f'; } /* '' */
|
||||
.bpmn-icon-manual-task:before { content: '\e840'; } /* '' */
|
||||
.bpmn-icon-send:before { content: '\e841'; } /* '' */
|
||||
.bpmn-icon-service:before { content: '\e842'; } /* '' */
|
||||
.bpmn-icon-receive-task:before { content: '\e843'; } /* '' */
|
||||
.bpmn-icon-user:before { content: '\e844'; } /* '' */
|
||||
.bpmn-icon-start-event-none:before { content: '\e845'; } /* '' */
|
||||
.bpmn-icon-intermediate-event-throw-escalation:before { content: '\e846'; } /* '' */
|
||||
.bpmn-icon-intermediate-event-catch-multiple:before { content: '\e847'; } /* '' */
|
||||
.bpmn-icon-intermediate-event-catch-non-interrupting-escalation:before { content: '\e848'; } /* '' */
|
||||
.bpmn-icon-intermediate-event-throw-link:before { content: '\e849'; } /* '' */
|
||||
.bpmn-icon-start-event-non-interrupting-condition:before { content: '\e84a'; } /* '' */
|
||||
.bpmn-icon-data-object:before { content: '\e84b'; } /* '' */
|
||||
.bpmn-icon-script-task:before { content: '\e84c'; } /* '' */
|
||||
.bpmn-icon-send-task:before { content: '\e84d'; } /* '' */
|
||||
.bpmn-icon-data-store:before { content: '\e84e'; } /* '' */
|
||||
.bpmn-icon-start-event-non-interrupting-escalation:before { content: '\e84f'; } /* '' */
|
||||
.bpmn-icon-intermediate-event-throw-message:before { content: '\e850'; } /* '' */
|
||||
.bpmn-icon-intermediate-event-catch-non-interrupting-multiple:before { content: '\e851'; } /* '' */
|
||||
.bpmn-icon-intermediate-event-catch-non-interrupting-signal:before { content: '\e852'; } /* '' */
|
||||
.bpmn-icon-intermediate-event-throw-multiple:before { content: '\e853'; } /* '' */
|
||||
.bpmn-icon-start-event-non-interrupting-message:before { content: '\e854'; } /* '' */
|
||||
.bpmn-icon-ad-hoc-marker:before { content: '\e855'; } /* '' */
|
||||
.bpmn-icon-service-task:before { content: '\e856'; } /* '' */
|
||||
.bpmn-icon-task-none:before { content: '\e857'; } /* '' */
|
||||
.bpmn-icon-compensation-marker:before { content: '\e858'; } /* '' */
|
||||
.bpmn-icon-start-event-non-interrupting-multiple:before { content: '\e859'; } /* '' */
|
||||
.bpmn-icon-intermediate-event-throw-signal:before { content: '\e85a'; } /* '' */
|
||||
.bpmn-icon-intermediate-event-catch-non-interrupting-condition:before { content: '\e85b'; } /* '' */
|
||||
.bpmn-icon-participant:before { content: '\e85c'; } /* '' */
|
||||
.bpmn-icon-event-subprocess-expanded:before { content: '\e85d'; } /* '' */
|
||||
.bpmn-icon-lane-insert-below:before { content: '\e85e'; } /* '' */
|
||||
.bpmn-icon-space-tool:before { content: '\e85f'; } /* '' */
|
||||
.bpmn-icon-connection-multi:before { content: '\e860'; } /* '' */
|
||||
.bpmn-icon-lane:before { content: '\e861'; } /* '' */
|
||||
.bpmn-icon-lasso-tool:before { content: '\e862'; } /* '' */
|
||||
.bpmn-icon-lane-insert-above:before { content: '\e863'; } /* '' */
|
||||
.bpmn-icon-lane-divide-three:before { content: '\e864'; } /* '' */
|
||||
.bpmn-icon-lane-divide-two:before { content: '\e865'; } /* '' */
|
||||
.bpmn-icon-data-input:before { content: '\e866'; } /* '' */
|
||||
.bpmn-icon-data-output:before { content: '\e867'; } /* '' */
|
||||
.bpmn-icon-hand-tool:before { content: '\e868'; } /* '' */
|
||||
.bpmn-icon-group:before { content: '\e869'; } /* '' */
|
||||
.bpmn-icon-text-annotation:before { content: '\e86b'; } /* '' */
|
||||
.bpmn-icon-transaction:before { content: '\e8c4'; } /* '' */
|
||||
.bpmn-icon-screw-wrench:before { content: '\e8db'; } /* '' */
|
||||
.bpmn-icon-connection:before { content: '\e8dc'; } /* '' */
|
||||
.bpmn-icon-conditional-flow:before { content: '\e8e0'; } /* '' */
|
||||
.bpmn-icon-default-flow:before { content: '\e8e1'; } /* '' */
|
||||
166
server/src/main/resources/static/bpmn/css/bpmn-embedded.css
Normal file
166
server/src/main/resources/static/bpmn/css/bpmn-embedded.css
Normal file
File diff suppressed because one or more lines are too long
163
server/src/main/resources/static/bpmn/css/bpmn.css
Normal file
163
server/src/main/resources/static/bpmn/css/bpmn.css
Normal file
@@ -0,0 +1,163 @@
|
||||
@font-face {
|
||||
font-family: 'bpmn';
|
||||
src: url('../font/bpmn.eot?21877404');
|
||||
src: url('../font/bpmn.eot?21877404#iefix') format('embedded-opentype'),
|
||||
url('../font/bpmn.woff2?21877404') format('woff2'),
|
||||
url('../font/bpmn.woff?21877404') format('woff'),
|
||||
url('../font/bpmn.ttf?21877404') format('truetype'),
|
||||
url('../font/bpmn.svg?21877404#bpmn') format('svg');
|
||||
font-weight: normal;
|
||||
font-style: normal;
|
||||
}
|
||||
/* Chrome hack: SVG is rendered more smooth in Windozze. 100% magic, uncomment if you need it. */
|
||||
/* Note, that will break hinting! In other OS-es font will be not as sharp as it could be */
|
||||
/*
|
||||
@media screen and (-webkit-min-device-pixel-ratio:0) {
|
||||
@font-face {
|
||||
font-family: 'bpmn';
|
||||
src: url('../font/bpmn.svg?21877404#bpmn') format('svg');
|
||||
}
|
||||
}
|
||||
*/
|
||||
[class^="bpmn-icon-"]:before, [class*=" bpmn-icon-"]:before {
|
||||
font-family: "bpmn";
|
||||
font-style: normal;
|
||||
font-weight: normal;
|
||||
speak: never;
|
||||
|
||||
display: inline-block;
|
||||
text-decoration: inherit;
|
||||
width: 1em;
|
||||
/* margin-right: .2em; */
|
||||
text-align: center;
|
||||
/* opacity: .8; */
|
||||
|
||||
/* For safety - reset parent styles, that can break glyph codes*/
|
||||
font-variant: normal;
|
||||
text-transform: none;
|
||||
|
||||
/* fix buttons height, for twitter bootstrap */
|
||||
line-height: 1em;
|
||||
|
||||
/* Animation center compensation - margins should be symmetric */
|
||||
/* remove if not needed */
|
||||
/* margin-left: .2em; */
|
||||
|
||||
/* you can be more comfortable with increased icons size */
|
||||
/* font-size: 120%; */
|
||||
|
||||
/* Font smoothing. That was taken from TWBS */
|
||||
-webkit-font-smoothing: antialiased;
|
||||
-moz-osx-font-smoothing: grayscale;
|
||||
|
||||
/* Uncomment for 3D effect */
|
||||
/* text-shadow: 1px 1px 1px rgba(127, 127, 127, 0.3); */
|
||||
}
|
||||
|
||||
.bpmn-icon-trash:before { content: '\e801'; } /* '' */
|
||||
.bpmn-icon-gateway-parallel:before { content: '\e804'; } /* '' */
|
||||
.bpmn-icon-intermediate-event-catch-cancel:before { content: '\e805'; } /* '' */
|
||||
.bpmn-icon-intermediate-event-catch-non-interrupting-message:before { content: '\e806'; } /* '' */
|
||||
.bpmn-icon-start-event-compensation:before { content: '\e807'; } /* '' */
|
||||
.bpmn-icon-start-event-non-interrupting-parallel-multiple:before { content: '\e808'; } /* '' */
|
||||
.bpmn-icon-loop-marker:before { content: '\e809'; } /* '' */
|
||||
.bpmn-icon-parallel-mi-marker:before { content: '\e80a'; } /* '' */
|
||||
.bpmn-icon-start-event-non-interrupting-signal:before { content: '\e80b'; } /* '' */
|
||||
.bpmn-icon-intermediate-event-catch-non-interrupting-timer:before { content: '\e80c'; } /* '' */
|
||||
.bpmn-icon-intermediate-event-catch-parallel-multiple:before { content: '\e80d'; } /* '' */
|
||||
.bpmn-icon-intermediate-event-catch-compensation:before { content: '\e80e'; } /* '' */
|
||||
.bpmn-icon-gateway-xor:before { content: '\e80f'; } /* '' */
|
||||
.bpmn-icon-end-event-cancel:before { content: '\e811'; } /* '' */
|
||||
.bpmn-icon-intermediate-event-catch-condition:before { content: '\e812'; } /* '' */
|
||||
.bpmn-icon-intermediate-event-catch-non-interrupting-parallel-multiple:before { content: '\e813'; } /* '' */
|
||||
.bpmn-icon-start-event-condition:before { content: '\e814'; } /* '' */
|
||||
.bpmn-icon-start-event-non-interrupting-timer:before { content: '\e815'; } /* '' */
|
||||
.bpmn-icon-sequential-mi-marker:before { content: '\e816'; } /* '' */
|
||||
.bpmn-icon-user-task:before { content: '\e817'; } /* '' */
|
||||
.bpmn-icon-business-rule:before { content: '\e818'; } /* '' */
|
||||
.bpmn-icon-sub-process-marker:before { content: '\e819'; } /* '' */
|
||||
.bpmn-icon-start-event-parallel-multiple:before { content: '\e81a'; } /* '' */
|
||||
.bpmn-icon-start-event-error:before { content: '\e81b'; } /* '' */
|
||||
.bpmn-icon-intermediate-event-catch-signal:before { content: '\e81c'; } /* '' */
|
||||
.bpmn-icon-intermediate-event-catch-error:before { content: '\e81d'; } /* '' */
|
||||
.bpmn-icon-end-event-compensation:before { content: '\e81e'; } /* '' */
|
||||
.bpmn-icon-subprocess-collapsed:before { content: '\e81f'; } /* '' */
|
||||
.bpmn-icon-subprocess-expanded:before { content: '\e820'; } /* '' */
|
||||
.bpmn-icon-task:before { content: '\e821'; } /* '' */
|
||||
.bpmn-icon-end-event-error:before { content: '\e822'; } /* '' */
|
||||
.bpmn-icon-intermediate-event-catch-escalation:before { content: '\e823'; } /* '' */
|
||||
.bpmn-icon-intermediate-event-catch-timer:before { content: '\e824'; } /* '' */
|
||||
.bpmn-icon-start-event-escalation:before { content: '\e825'; } /* '' */
|
||||
.bpmn-icon-start-event-signal:before { content: '\e826'; } /* '' */
|
||||
.bpmn-icon-business-rule-task:before { content: '\e827'; } /* '' */
|
||||
.bpmn-icon-manual:before { content: '\e828'; } /* '' */
|
||||
.bpmn-icon-receive:before { content: '\e829'; } /* '' */
|
||||
.bpmn-icon-call-activity:before { content: '\e82a'; } /* '' */
|
||||
.bpmn-icon-start-event-timer:before { content: '\e82b'; } /* '' */
|
||||
.bpmn-icon-start-event-message:before { content: '\e82c'; } /* '' */
|
||||
.bpmn-icon-intermediate-event-none:before { content: '\e82d'; } /* '' */
|
||||
.bpmn-icon-intermediate-event-catch-link:before { content: '\e82e'; } /* '' */
|
||||
.bpmn-icon-end-event-escalation:before { content: '\e82f'; } /* '' */
|
||||
.bpmn-icon-bpmn-io:before { content: '\e831'; } /* '' */
|
||||
.bpmn-icon-gateway-complex:before { content: '\e832'; } /* '' */
|
||||
.bpmn-icon-gateway-eventbased:before { content: '\e833'; } /* '' */
|
||||
.bpmn-icon-gateway-none:before { content: '\e834'; } /* '' */
|
||||
.bpmn-icon-gateway-or:before { content: '\e835'; } /* '' */
|
||||
.bpmn-icon-end-event-terminate:before { content: '\e836'; } /* '' */
|
||||
.bpmn-icon-end-event-signal:before { content: '\e837'; } /* '' */
|
||||
.bpmn-icon-end-event-none:before { content: '\e838'; } /* '' */
|
||||
.bpmn-icon-end-event-multiple:before { content: '\e839'; } /* '' */
|
||||
.bpmn-icon-end-event-message:before { content: '\e83a'; } /* '' */
|
||||
.bpmn-icon-end-event-link:before { content: '\e83b'; } /* '' */
|
||||
.bpmn-icon-intermediate-event-catch-message:before { content: '\e83c'; } /* '' */
|
||||
.bpmn-icon-intermediate-event-throw-compensation:before { content: '\e83d'; } /* '' */
|
||||
.bpmn-icon-start-event-multiple:before { content: '\e83e'; } /* '' */
|
||||
.bpmn-icon-script:before { content: '\e83f'; } /* '' */
|
||||
.bpmn-icon-manual-task:before { content: '\e840'; } /* '' */
|
||||
.bpmn-icon-send:before { content: '\e841'; } /* '' */
|
||||
.bpmn-icon-service:before { content: '\e842'; } /* '' */
|
||||
.bpmn-icon-receive-task:before { content: '\e843'; } /* '' */
|
||||
.bpmn-icon-user:before { content: '\e844'; } /* '' */
|
||||
.bpmn-icon-start-event-none:before { content: '\e845'; } /* '' */
|
||||
.bpmn-icon-intermediate-event-throw-escalation:before { content: '\e846'; } /* '' */
|
||||
.bpmn-icon-intermediate-event-catch-multiple:before { content: '\e847'; } /* '' */
|
||||
.bpmn-icon-intermediate-event-catch-non-interrupting-escalation:before { content: '\e848'; } /* '' */
|
||||
.bpmn-icon-intermediate-event-throw-link:before { content: '\e849'; } /* '' */
|
||||
.bpmn-icon-start-event-non-interrupting-condition:before { content: '\e84a'; } /* '' */
|
||||
.bpmn-icon-data-object:before { content: '\e84b'; } /* '' */
|
||||
.bpmn-icon-script-task:before { content: '\e84c'; } /* '' */
|
||||
.bpmn-icon-send-task:before { content: '\e84d'; } /* '' */
|
||||
.bpmn-icon-data-store:before { content: '\e84e'; } /* '' */
|
||||
.bpmn-icon-start-event-non-interrupting-escalation:before { content: '\e84f'; } /* '' */
|
||||
.bpmn-icon-intermediate-event-throw-message:before { content: '\e850'; } /* '' */
|
||||
.bpmn-icon-intermediate-event-catch-non-interrupting-multiple:before { content: '\e851'; } /* '' */
|
||||
.bpmn-icon-intermediate-event-catch-non-interrupting-signal:before { content: '\e852'; } /* '' */
|
||||
.bpmn-icon-intermediate-event-throw-multiple:before { content: '\e853'; } /* '' */
|
||||
.bpmn-icon-start-event-non-interrupting-message:before { content: '\e854'; } /* '' */
|
||||
.bpmn-icon-ad-hoc-marker:before { content: '\e855'; } /* '' */
|
||||
.bpmn-icon-service-task:before { content: '\e856'; } /* '' */
|
||||
.bpmn-icon-task-none:before { content: '\e857'; } /* '' */
|
||||
.bpmn-icon-compensation-marker:before { content: '\e858'; } /* '' */
|
||||
.bpmn-icon-start-event-non-interrupting-multiple:before { content: '\e859'; } /* '' */
|
||||
.bpmn-icon-intermediate-event-throw-signal:before { content: '\e85a'; } /* '' */
|
||||
.bpmn-icon-intermediate-event-catch-non-interrupting-condition:before { content: '\e85b'; } /* '' */
|
||||
.bpmn-icon-participant:before { content: '\e85c'; } /* '' */
|
||||
.bpmn-icon-event-subprocess-expanded:before { content: '\e85d'; } /* '' */
|
||||
.bpmn-icon-lane-insert-below:before { content: '\e85e'; } /* '' */
|
||||
.bpmn-icon-space-tool:before { content: '\e85f'; } /* '' */
|
||||
.bpmn-icon-connection-multi:before { content: '\e860'; } /* '' */
|
||||
.bpmn-icon-lane:before { content: '\e861'; } /* '' */
|
||||
.bpmn-icon-lasso-tool:before { content: '\e862'; } /* '' */
|
||||
.bpmn-icon-lane-insert-above:before { content: '\e863'; } /* '' */
|
||||
.bpmn-icon-lane-divide-three:before { content: '\e864'; } /* '' */
|
||||
.bpmn-icon-lane-divide-two:before { content: '\e865'; } /* '' */
|
||||
.bpmn-icon-data-input:before { content: '\e866'; } /* '' */
|
||||
.bpmn-icon-data-output:before { content: '\e867'; } /* '' */
|
||||
.bpmn-icon-hand-tool:before { content: '\e868'; } /* '' */
|
||||
.bpmn-icon-group:before { content: '\e869'; } /* '' */
|
||||
.bpmn-icon-text-annotation:before { content: '\e86b'; } /* '' */
|
||||
.bpmn-icon-transaction:before { content: '\e8c4'; } /* '' */
|
||||
.bpmn-icon-screw-wrench:before { content: '\e8db'; } /* '' */
|
||||
.bpmn-icon-connection:before { content: '\e8dc'; } /* '' */
|
||||
.bpmn-icon-conditional-flow:before { content: '\e8e0'; } /* '' */
|
||||
.bpmn-icon-default-flow:before { content: '\e8e1'; } /* '' */
|
||||
986
server/src/main/resources/static/bpmn/diagram-js.css
Normal file
986
server/src/main/resources/static/bpmn/diagram-js.css
Normal file
File diff suppressed because it is too large
Load Diff
BIN
server/src/main/resources/static/bpmn/font/bpmn.eot
Normal file
BIN
server/src/main/resources/static/bpmn/font/bpmn.eot
Normal file
Binary file not shown.
224
server/src/main/resources/static/bpmn/font/bpmn.svg
Normal file
224
server/src/main/resources/static/bpmn/font/bpmn.svg
Normal file
File diff suppressed because one or more lines are too long
|
After Width: | Height: | Size: 130 KiB |
BIN
server/src/main/resources/static/bpmn/font/bpmn.ttf
Normal file
BIN
server/src/main/resources/static/bpmn/font/bpmn.ttf
Normal file
Binary file not shown.
BIN
server/src/main/resources/static/bpmn/font/bpmn.woff
Normal file
BIN
server/src/main/resources/static/bpmn/font/bpmn.woff
Normal file
Binary file not shown.
BIN
server/src/main/resources/static/bpmn/font/bpmn.woff2
Normal file
BIN
server/src/main/resources/static/bpmn/font/bpmn.woff2
Normal file
Binary file not shown.
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
Load Diff
@@ -1 +0,0 @@
|
||||
{"version":3,"sources":[],"names":[],"mappings":"","file":"gitalk.css","sourceRoot":""}
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
BIN
server/src/main/resources/static/images/alipay.jpeg
Normal file
BIN
server/src/main/resources/static/images/alipay.jpeg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 211 KiB |
BIN
server/src/main/resources/static/images/wxpay.jpeg
Normal file
BIN
server/src/main/resources/static/images/wxpay.jpeg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 130 KiB |
@@ -1,4 +1,4 @@
|
||||
<!DOCTYPE html>
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
|
||||
<head>
|
||||
@@ -45,6 +45,8 @@
|
||||
</div>
|
||||
<div id="zoomSelect" class="select-icon" title="缩放比例">
|
||||
<select id="zoomValue">
|
||||
<option value="width">适合页宽</option>
|
||||
<option value="4.0">400%</option>
|
||||
<option value="3.0">300%</option>
|
||||
<option value="2.0">200%</option>
|
||||
<option value="1.5">150%</option>
|
||||
|
||||
@@ -53,6 +53,7 @@ window.onresize = function() {
|
||||
} ();
|
||||
};
|
||||
|
||||
// 手机端,隐藏缩放比例选择框,打开文件和打印按钮
|
||||
if (this.isMobile()) {
|
||||
if (document.getElementById("zoomSelect")) document.getElementById("zoomSelect").style.display = "none";
|
||||
if (document.getElementById("openFile")) document.getElementById("openFile").style.display = "none";
|
||||
@@ -61,11 +62,12 @@ if (this.isMobile()) {
|
||||
if (document.getElementById("separator2")) document.getElementById("separator2").style.display = "none";
|
||||
}
|
||||
|
||||
// 判断手机端还是PC端
|
||||
function isMobile() {
|
||||
var flag = navigator.userAgent.match(/(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|BlackBerry|IEMobile|MQQBrowser|JUC|Fennec|wOSBrowser|BrowserNG|WebOS|Symbian|Windows Phone)/i);
|
||||
return flag;
|
||||
}
|
||||
|
||||
// 判断是否IE浏览器
|
||||
function isIE() {
|
||||
var navigator = window.navigator.userAgent;
|
||||
if (navigator.indexOf("MSIE") > 0 || navigator.indexOf("Trident") > 0) {
|
||||
@@ -96,9 +98,34 @@ data: function data() {
|
||||
};
|
||||
}
|
||||
|
||||
this.pageZoomScale = "1.0";
|
||||
cnofd["setScaleValue"](this.pageZoomScale);
|
||||
var scale = this.getQueryVariable("scale");
|
||||
if (scale && (scale == "width" || Number(scale))) {
|
||||
this.pageZoomScale = scale;
|
||||
cnofd["setScaleValue"](scale);
|
||||
}
|
||||
|
||||
var file = this.getQueryVariable("file");
|
||||
file = decodeURIComponent(file);
|
||||
if (file) this.loadOfdFile(file);
|
||||
|
||||
if (scale && (scale == "width" || Number(scale))) {
|
||||
var selectZoom = document.getElementById("zoomValue");
|
||||
|
||||
selectZoom.selectedIndex = -1;
|
||||
if (this.pageZoomScale == "width") {
|
||||
selectZoom.selectedIndex = 0;
|
||||
} else {
|
||||
for (var i = 1; i < selectZoom.length; i++) {
|
||||
if (Math.abs(this.pageZoomScale - selectZoom.options[i].value) < 0.01) {
|
||||
selectZoom.selectedIndex = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function getQueryVariable(variable) {
|
||||
var query = window.location.search.substring(1);
|
||||
var vars = query.split("&");
|
||||
@@ -125,8 +152,7 @@ function loadOfdFile(ofdFile) {
|
||||
that.ofdBase64 = base64String;
|
||||
}
|
||||
});
|
||||
ofdFile = ofdFile = decodeURIComponent(ofdFile);
|
||||
this.getOfdDocument(ofdFile, this.screenWidth);
|
||||
this.getOfdDocument(ofdFile, this.screenWidth, this.pageZoomScale);
|
||||
|
||||
setPageInfo();
|
||||
}
|
||||
@@ -170,10 +196,12 @@ function fileChanged() {
|
||||
return;
|
||||
}
|
||||
|
||||
Object(cnofd["setScaleValue"])(1.0);
|
||||
// 新打开OFD文件时,还原成页面实际尺寸显示
|
||||
//Object(cnofd["setScaleValue"])(1.0);
|
||||
Object(cnofd["setScaleValue"])(this.pageZoomScale);
|
||||
var selectZoom = document.getElementById("zoomValue");
|
||||
if (selectZoom)
|
||||
selectZoom.value = "1.0";
|
||||
selectZoom.value = this.pageZoomScale;
|
||||
|
||||
var that = this;
|
||||
var reader = new FileReader();
|
||||
@@ -183,10 +211,11 @@ function fileChanged() {
|
||||
that.ofdBase64 = e.target.result.split(",")[1];
|
||||
};
|
||||
|
||||
this.getOfdDocument(this.file, this.screenWidth);
|
||||
this.getOfdDocument(this.file, this.screenWidth, this.pageZoomScale);
|
||||
//$("#file")[0].value = null;
|
||||
}
|
||||
|
||||
function getOfdDocument(file, screenWidth) {
|
||||
function getOfdDocument(file, screenWidth, pageZoomScale) {
|
||||
var that = this;
|
||||
|
||||
$("#loading").show();
|
||||
@@ -199,14 +228,18 @@ function getOfdDocument(file, screenWidth) {
|
||||
that.ofdDoc = res;
|
||||
that.pageIndex = 1;
|
||||
that.pageCount = res.pageCount;
|
||||
var divs = Object(cnofd["ofdRender"])(res, screenWidth);
|
||||
that.displayOfdDiv(divs);
|
||||
if (pageZoomScale == "width") {
|
||||
var divs = Object(cnofd["ofdRender"])(res, screenWidth);
|
||||
that.displayOfdDiv(divs);
|
||||
} else {
|
||||
var divs = Object(cnofd["ofdRenderByScale"])(res, screenWidth, pageZoomScale);
|
||||
that.displayOfdDiv(divs);
|
||||
}
|
||||
$("#loading").hide();
|
||||
},
|
||||
fail: function fail(error) {
|
||||
$("#loading").hide();
|
||||
|
||||
that.$alert("OFD打开失败", error, {
|
||||
alert("OFD打开失败", error, {
|
||||
confirmButtonText: "确定",
|
||||
callback: function callback(action) {
|
||||
this.$message({
|
||||
@@ -242,7 +275,7 @@ function displayOfdDiv(divs) {
|
||||
|
||||
function zoomIn() {
|
||||
var selectZoom = document.getElementById("zoomValue");
|
||||
if (selectZoom.selectedIndex > 0) {
|
||||
if (selectZoom.selectedIndex > 1) {
|
||||
selectZoom.selectedIndex = selectZoom.selectedIndex - 1;
|
||||
|
||||
Object(cnofd["setScaleValue"])(selectZoom.options[selectZoom.selectedIndex].value);
|
||||
@@ -259,6 +292,7 @@ function zoomOut() {
|
||||
var selectZoom = document.getElementById("zoomValue");
|
||||
if (selectZoom.selectedIndex < selectZoom.length-1) {
|
||||
selectZoom.selectedIndex = selectZoom.selectedIndex + 1;
|
||||
if (selectZoom.selectedIndex == 0) selectZoom.selectedIndex = 1;
|
||||
|
||||
Object(cnofd["setScaleValue"])(selectZoom.options[selectZoom.selectedIndex].value);
|
||||
var divs = Object(cnofd["ofdRenderByScale"])(this.ofdDoc);
|
||||
@@ -272,13 +306,23 @@ function zoomOut() {
|
||||
|
||||
function zoomChange() {
|
||||
var selectZoom = document.getElementById("zoomValue");
|
||||
Object(cnofd["setScaleValue"])(selectZoom.options[selectZoom.selectedIndex].value);
|
||||
var divs = Object(cnofd["ofdRenderByScale"])(this.ofdDoc);
|
||||
if (divs) {
|
||||
this.displayOfdDiv(divs);
|
||||
if (selectZoom.options[selectZoom.selectedIndex].value == "width") {
|
||||
Object(cnofd["setScaleValue"])(selectZoom.options[selectZoom.selectedIndex].value);
|
||||
var divs = Object(cnofd["ofdRender"])(this.ofdDoc, this.screenWidth);
|
||||
if (divs) {
|
||||
this.displayOfdDiv(divs);
|
||||
} else {
|
||||
this.getOfdDocument(this.file, this.screenWidth);
|
||||
}
|
||||
} else {
|
||||
this.getOfdDocument(this.file, this.screenWidth);
|
||||
}
|
||||
Object(cnofd["setScaleValue"])(selectZoom.options[selectZoom.selectedIndex].value);
|
||||
var divs = Object(cnofd["ofdRenderByScale"])(this.ofdDoc);
|
||||
if (divs) {
|
||||
this.displayOfdDiv(divs);
|
||||
} else {
|
||||
this.getOfdDocument(this.file, this.screenWidth);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function scrool() {
|
||||
@@ -362,7 +406,7 @@ function print() {
|
||||
if (list.length > 0) {
|
||||
if (!isIE()) {
|
||||
var mywindow = window.open("打印窗口", "_blank");
|
||||
mywindow.document.write('<!DOCTYPE html><html><head>'
|
||||
mywindow.document.write('<!DOCTYPE html><html><head>'
|
||||
+'<style media="print">.page-break { page-break-inside: avoid; page-break-after: always; }</style>'
|
||||
+'</head><body></body</html>');
|
||||
var documentBody = mywindow.document.body;
|
||||
@@ -399,7 +443,9 @@ function print() {
|
||||
}
|
||||
}
|
||||
|
||||
// IE浏览器,在iframe里调用打印
|
||||
function printIE(printhtml) {
|
||||
//新建一个iframe
|
||||
var iframe = document.createElement("iframe");
|
||||
iframe.id = "printf";
|
||||
iframe.style.width = "0";
|
||||
@@ -407,6 +453,7 @@ function printIE(printhtml) {
|
||||
iframe.style.height = "0";
|
||||
iframe.style.border = "none";
|
||||
|
||||
//将iframe插入到printBody里
|
||||
document.body.appendChild(iframe);
|
||||
|
||||
setTimeout(function () {
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user