onlyOffice缺失文件修补

This commit is contained in:
XaoLi717 2025-01-13 14:46:07 +08:00
parent e8e141a26b
commit 400210f5b5
15 changed files with 10367 additions and 0 deletions

View File

@ -0,0 +1,326 @@
package cn.iocoder.yudao.module.only.controller.admin.only;
import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
import cn.iocoder.yudao.module.bpm.controller.admin.onlyoffice.utils.DocumentConstants;
import cn.iocoder.yudao.module.bpm.controller.admin.onlyoffice.utils.FileUtil;
import cn.iocoder.yudao.module.bpm.controller.admin.onlyoffice.utils.Md5Utils;
import cn.iocoder.yudao.module.bpm.controller.admin.onlyoffice.vo.Document;
import cn.iocoder.yudao.module.bpm.dal.dataobject.onlyoffice.onlyofficeDO;
import cn.iocoder.yudao.module.bpm.service.onlyoffice.document.DocumentService;
import cn.iocoder.yudao.module.bpm.service.onlyoffice.fileupload.FileUploadService;
import cn.iocoder.yudao.module.only.controller.admin.only.vo.onlyofPageReqVO;
import cn.iocoder.yudao.module.only.controller.admin.only.vo.onlyofRespVO;
import cn.iocoder.yudao.module.only.controller.admin.only.vo.onlyofSaveReqVO;
import cn.iocoder.yudao.module.only.dal.dataobject.only.onlyofDO;
import cn.iocoder.yudao.module.only.service.only.onlyofService;
import com.alibaba.fastjson.JSON;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.apache.commons.lang3.StringUtils;
import org.hashids.Hashids;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.ModelAndView;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.*;
import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
@Tag(name = "管理后台 - 文件编辑")
@RestController
@RequestMapping("/only/onlyof")
@Validated
@Controller
public class onlyofController {
@Value("${files.savePath}")
private String filePath;
@Value("${files.docservice.url.site}")
private String officeUrl;
@Value("${files.docservice.url.command}")
private String officeCommand;
@Autowired
private DocumentService documentService;
@Autowired
private FileUploadService uploadService;
@Autowired
RestTemplate restTemplate;
// @Resource
// private DocumentService documentService;
@Resource
private onlyofService onlyofService;
@GetMapping("/page")
@Operation(summary = "获得文件编辑分页")
@PreAuthorize("@ss.hasPermission('only:onlyof:query')")
public CommonResult<PageResult<onlyofRespVO>> getonlyofPage(@Valid onlyofPageReqVO pageReqVO) {
PageResult<onlyofDO> pageResult = onlyofService.getonlyofPage(pageReqVO);
return success(BeanUtils.toBean(pageResult, onlyofRespVO.class));
}
/**
* \
* 查询所有上传文档信息接口
*
* @return
*/
@GetMapping("/filelist")
@Operation(summary = "获取文件列表")
@PreAuthorize("@ss.hasPermission('only:onlyof:filelist')")
public ResponseEntity<Object> listFile() {
return new ResponseEntity<Object>(uploadService.list(), HttpStatus.OK);
}
/**
* 文件编辑的上传文件接口
* @param file
* @param request
* @return
* @throws Exception
*/
@PostMapping("/update")
@Operation(summary = "更新文件编辑")
@PreAuthorize("@ss.hasPermission('only:onlyof:update')")
public ResponseEntity<Object> upload(@RequestParam("file") MultipartFile file,@RequestParam("cDate") String cDate,HttpServletRequest request) throws Exception {
cDate = cDate.isEmpty() ? cDate : cDate + "\\";
// System.out.println("update"+file.getOriginalFilename()+uuid);
if (file.isEmpty()){
throw new Exception("上传文件不能为空");
}
onlyofficeDO upload = new onlyofficeDO();
String fileName = file.getOriginalFilename();
//更新保存文件信息到数据库
FileUtil.saveFile(file.getInputStream(),filePath+cDate+file.getOriginalFilename(),filePath+cDate);
upload.setUploadDate(new Date());
upload.setFilePath(filePath+cDate);
upload.setFileName(file.getOriginalFilename());
upload.setFileSize(file.getSize());
// System.out.println("111"+upload);
uploadService.save(upload);
System.gc();
return new ResponseEntity<Object>("上传成功", HttpStatus.OK);
}
/**
* 编辑文件的接口
* @param name
* @param userName
* @param userId
* @param token
* @param model
* @return
*/
@GetMapping("/edit")
@Operation(summary = "编辑文件")
@PreAuthorize("@ss.hasPermission('only:onlyof:edit')")
public ModelAndView editDocFile(@RequestParam String name, String userName, String userId ,String cDate ,String token, Model model) {
String cDate2 = "";
cDate2 = cDate.isEmpty() ? cDate : cDate + "\\";
String path = filePath+cDate2+name;
// System.out.println("path:"+path);
// System.out.println("edit"+uuid2);
// System.out.println("token"+token);
ModelAndView mav = new ModelAndView();
Document document = documentService.getDocumentToken(documentService.buildDocument(path, name),token,cDate);
mav.addObject("document", document);
if (!documentService.canEdit(document)) {
// System.out.println("demo");
return mav;
}
mav.addObject("documentEditParam", documentService.buildDocumentEditParamToken(userId, userName, name,token,cDate2));
mav.setViewName("editor");
// System.out.println(mav);
return mav;
}
/**
* 下载文档接口
* @param name
* @param response
*/
@GetMapping("/download")
@Operation(summary = "下载文件")
@PreAuthorize("@ss.hasPermission('only:onlyof:download')")
public void download(String name, String cDate,HttpServletResponse response) {
cDate = cDate.equals("") ? cDate : cDate + "\\";
// System.out.println("download: "+name+"---"+response+"---"+uuid);
System.out.println("cDate:"+cDate);
try {
FileUtil.downLoadFile(name,filePath+cDate,response);
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 文件编辑打开保存后的回调函数
* @param request
* @param response
* @throws IOException
*/
@RequestMapping("/callback")
@Operation(summary = "回调文件")
@PreAuthorize("@ss.hasPermission('only:onlyof:callback')")
public void saveDocumentFile(HttpServletRequest request, HttpServletResponse response,String cDate) throws IOException {
// System.out.println("callback"+uuid);
//处理编辑回调逻辑
callBack(request, response,cDate);
}
/**
* 获取文件状态的接口
* @param name
* @return
* @throws ParseException
*/
@GetMapping("/editStatus")
@Operation(summary = "文件状态")
@PreAuthorize("@ss.hasPermission('only:onlyof:editStatus')")
public ResponseEntity<Object> getDoucmentEditStatus(String name,String cDate) throws ParseException {
cDate = (cDate != null && !cDate.isEmpty()) ? cDate + "\\" : cDate;
// System.out.println("editStatus");
String url = officeUrl+officeCommand;
Map<String,String> map = new HashMap<String,String>();
map.put("c", "forcesave");
String docFileMd5 = Md5Utils.getFileMd5(new File(filePath+cDate+name));
if (StringUtils.isBlank(docFileMd5)) {
// throw new DocumentException(ErrorCodeEnum.DOC_FILE_MD5_ERROR);
}
String pathShortMd5 = Md5Utils.md5(filePath + name);
String nameShortMd5 = Md5Utils.md5(name);
Hashids hashids = new Hashids(DocumentConstants.HASH_KEY);
// (将路径字符串短md5值 + 名称字符串短md5值) ==> 再转成短id形式 ==> 作为文档的key暂且认为是不会重复的
String key = hashids.encodeHex(String.format("%s%s%s", docFileMd5,pathShortMd5, nameShortMd5));
map.put("key", key);
map.put("userdata", "sample userdata");
JSONObject obj = (JSONObject) new JSONParser().parse(FileUtil.editStatus(url, JSON.toJSONString(map)));
// System.out.println("obj"+obj);
return new ResponseEntity<Object>(obj, HttpStatus.OK);
}
/**
* 处理在线编辑文档的逻辑
* @param request
* @param response
* @throws IOException
*/
/* 状态
0 - no document with the key identifier could be found,
1 - document is being edited,
2 - document is ready for saving,
3 - document saving error has occurred,
4 - document is closed with no changes,
6 - document is being edited, but the current document state is saved,
7 - error has occurred while force saving the document.
* */
private void callBack(HttpServletRequest request, HttpServletResponse response, String cDate) throws IOException {
PrintWriter writer = null;
JSONObject jsonObj = null;
// System.out.println("===saveeditedfile------------");
try {
writer = response.getWriter();
Scanner scanner = new Scanner(request.getInputStream()).useDelimiter("\\A");
String body = scanner.hasNext() ? scanner.next() : "";
jsonObj = (JSONObject) new JSONParser().parse(body);
// System.out.println(jsonObj);
// System.out.println("===saveeditedfile:" + jsonObj.get("status"));
if ((long) jsonObj.get("status") == 2) {
FileUtil.callBackSaveDocument(jsonObj,filePath+cDate,request, response);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ParseException e) {
throw new RuntimeException(e);
}
/*
* status = 1我们给onlyoffice的服务返回{"error":"0"}的信息这样onlyoffice会认为回调接口是没问题的这样就可以在线编辑文档了否则的话会弹出窗口说明
* 在线编辑还没有关闭前端有人下载文档时强制保存最新内容 当status 是6时说明有人在编辑时下载文档
* */
// System.out.println(jsonObj.get("status"));
if ((long) jsonObj.get("status") == 6) {
//处理当文档正在编辑为关闭时下载文档
if (((String)jsonObj.get("userdata")).equals("sample userdata")){
FileUtil.callBackSaveDocument(jsonObj,filePath+cDate,request, response);
}
// System.out.println("====保存失败:");
writer.write("{\"error\":1}");
} else {
//执行删除编辑时下载保存的文件:
FileUtil.deleteTempFile(filePath+cDate,request.getParameter("fileName"));
writer.write("{\"error\":0}");
}
}
//下面是暂时没用到的接口留着
@PostMapping("/create")
@Operation(summary = "创建文件编辑")
@PreAuthorize("@ss.hasPermission('only:onlyof:create')")
public CommonResult<Integer> createonlyof(@Valid @RequestBody onlyofSaveReqVO createReqVO) {
return success(onlyofService.createonlyof(createReqVO));
}
@DeleteMapping("/delete")
@Operation(summary = "删除文件编辑")
@Parameter(name = "id", description = "编号", required = true)
@PreAuthorize("@ss.hasPermission('only:onlyof:delete')")
public CommonResult<Boolean> deleteonlyof(@RequestParam("id") Integer id) {
onlyofService.deleteonlyof(id);
return success(true);
}
@GetMapping("/get")
@Operation(summary = "获得文件编辑")
@Parameter(name = "id", description = "编号", required = true, example = "1024")
@PreAuthorize("@ss.hasPermission('only:onlyof:query')")
public CommonResult<onlyofRespVO> getonlyof(@RequestParam("id") Integer id) {
onlyofDO onlyof = onlyofService.getonlyof(id);
return success(BeanUtils.toBean(onlyof, onlyofRespVO.class));
}
@GetMapping("/export-excel")
@Operation(summary = "导出文件编辑 Excel")
@PreAuthorize("@ss.hasPermission('only:onlyof:export')")
@ApiAccessLog(operateType = EXPORT)
public void exportonlyofExcel(@Valid onlyofPageReqVO pageReqVO,
HttpServletResponse response) throws IOException {
pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
List<onlyofDO> list = onlyofService.getonlyofPage(pageReqVO).getList();
// 导出 Excel
ExcelUtils.write(response, "文件编辑.xls", "数据", onlyofRespVO.class,
BeanUtils.toBean(list, onlyofRespVO.class));
}
}

View File

@ -0,0 +1,43 @@
package cn.iocoder.yudao.module.only.controller.admin.only.vo;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
@Schema(description = "管理后台 - 文件编辑分页 Request VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class onlyofPageReqVO extends PageParam {
@Schema(description = "文件名", example = "芋艿")
private String fileName;
@Schema(description = "文件大小")
private Long fileSize;
@Schema(description = "文件类型", example = "1")
private String fileType;
@Schema(description = "文件路径")
private String filePath;
@Schema(description = "更新时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] uploadDate;
@Schema(description = "知识状态0正常 1停用", example = "1")
private String status;
@Schema(description = "创建时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] createTime;
}

View File

@ -0,0 +1,47 @@
package cn.iocoder.yudao.module.only.controller.admin.only.vo;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.time.LocalDateTime;
@Schema(description = "管理后台 - 文件编辑 Response VO")
@Data
@ExcelIgnoreUnannotated
public class onlyofRespVO {
@Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED, example = "32318")
@ExcelProperty("id")
private Integer id;
@Schema(description = "文件名", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋艿")
@ExcelProperty("文件名")
private String fileName;
@Schema(description = "文件大小")
@ExcelProperty("文件大小")
private Long fileSize;
@Schema(description = "文件类型", example = "1")
@ExcelProperty("文件类型")
private String fileType;
@Schema(description = "文件路径", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("文件路径")
private String filePath;
@Schema(description = "更新时间")
@ExcelProperty("更新时间")
private LocalDateTime uploadDate;
@Schema(description = "知识状态0正常 1停用", example = "1")
@ExcelProperty("知识状态0正常 1停用")
private String status;
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("创建时间")
private LocalDateTime createTime;
}

View File

@ -0,0 +1,36 @@
package cn.iocoder.yudao.module.only.controller.admin.only.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import javax.validation.constraints.NotEmpty;
import java.time.LocalDateTime;
@Schema(description = "管理后台 - 文件编辑新增/修改 Request VO")
@Data
public class onlyofSaveReqVO {
@Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED, example = "32318")
private Integer id;
@Schema(description = "文件名", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋艿")
@NotEmpty(message = "文件名不能为空")
private String fileName;
@Schema(description = "文件大小")
private Long fileSize;
@Schema(description = "文件类型", example = "1")
private String fileType;
@Schema(description = "文件路径", requiredMode = Schema.RequiredMode.REQUIRED)
@NotEmpty(message = "文件路径不能为空")
private String filePath;
@Schema(description = "更新时间")
private LocalDateTime uploadDate;
@Schema(description = "知识状态0正常 1停用", example = "1")
private String status;
}

View File

@ -0,0 +1,56 @@
package cn.iocoder.yudao.module.only.dal.dataobject.only;
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
import com.baomidou.mybatisplus.annotation.KeySequence;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.*;
import java.time.LocalDateTime;
/**
* 文件编辑 DO
*
* @author 君风
*/
@TableName("file_info")
@KeySequence("file_info_seq") // 用于 OraclePostgreSQLKingbaseDB2H2 数据库的主键自增如果是 MySQL 等数据库可不写
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class onlyofDO extends BaseDO {
/**
* id
*/
@TableId
private Integer id;
/**
* 文件名
*/
private String fileName;
/**
* 文件大小
*/
private Long fileSize;
/**
* 文件类型
*/
private String fileType;
/**
* 文件路径
*/
private String filePath;
/**
* 更新时间
*/
private LocalDateTime uploadDate;
/**
* 知识状态0正常 1停用
*/
private String status;
}

View File

@ -0,0 +1,30 @@
package cn.iocoder.yudao.module.only.dal.mysql.only;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.module.only.controller.admin.only.vo.onlyofPageReqVO;
import cn.iocoder.yudao.module.only.dal.dataobject.only.onlyofDO;
import org.apache.ibatis.annotations.Mapper;
/**
* 文件编辑 Mapper
*
* @author 君风
*/
@Mapper
public interface onlyofMapper extends BaseMapperX<onlyofDO> {
default PageResult<onlyofDO> selectPage(onlyofPageReqVO reqVO) {
return selectPage(reqVO, new LambdaQueryWrapperX<onlyofDO>()
.eqIfPresent(onlyofDO::getFileName, reqVO.getFileName())
.eqIfPresent(onlyofDO::getFileSize, reqVO.getFileSize())
.eqIfPresent(onlyofDO::getFileType, reqVO.getFileType())
.eqIfPresent(onlyofDO::getFilePath, reqVO.getFilePath())
.betweenIfPresent(onlyofDO::getUploadDate, reqVO.getUploadDate())
.eqIfPresent(onlyofDO::getStatus, reqVO.getStatus())
.betweenIfPresent(onlyofDO::getCreateTime, reqVO.getCreateTime())
.orderByDesc(onlyofDO::getId));
}
}

View File

@ -0,0 +1,55 @@
package cn.iocoder.yudao.module.only.service.only;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.only.controller.admin.only.vo.onlyofPageReqVO;
import cn.iocoder.yudao.module.only.controller.admin.only.vo.onlyofSaveReqVO;
import cn.iocoder.yudao.module.only.dal.dataobject.only.onlyofDO;
import javax.validation.Valid;
/**
* 文件编辑 Service 接口
*
* @author 君风
*/
public interface onlyofService {
/**
* 创建文件编辑
*
* @param createReqVO 创建信息
* @return 编号
*/
Integer createonlyof(@Valid onlyofSaveReqVO createReqVO);
/**
* 更新文件编辑
*
* @param updateReqVO 更新信息
*/
void updateonlyof(@Valid onlyofSaveReqVO updateReqVO);
/**
* 删除文件编辑
*
* @param id 编号
*/
void deleteonlyof(Integer id);
/**
* 获得文件编辑
*
* @param id 编号
* @return 文件编辑
*/
onlyofDO getonlyof(Integer id);
/**
* 获得文件编辑分页
*
* @param pageReqVO 分页查询
* @return 文件编辑分页
*/
PageResult<onlyofDO> getonlyofPage(onlyofPageReqVO pageReqVO);
}

View File

@ -0,0 +1,71 @@
package cn.iocoder.yudao.module.only.service.only;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.only.controller.admin.only.vo.onlyofPageReqVO;
import cn.iocoder.yudao.module.only.controller.admin.only.vo.onlyofSaveReqVO;
import cn.iocoder.yudao.module.only.dal.dataobject.only.onlyofDO;
import cn.iocoder.yudao.module.only.dal.mysql.only.onlyofMapper;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
import javax.annotation.Resource;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.ONLYOF_NOT_EXISTS;
/**
* 文件编辑 Service 实现类
*
* @author 君风
*/
@Service
@Validated
public class onlyofServiceImpl implements onlyofService {
@Resource
private onlyofMapper onlyofMapper;
@Override
public Integer createonlyof(onlyofSaveReqVO createReqVO) {
// 插入
onlyofDO onlyof = BeanUtils.toBean(createReqVO, onlyofDO.class);
onlyofMapper.insert(onlyof);
// 返回
return onlyof.getId();
}
@Override
public void updateonlyof(onlyofSaveReqVO updateReqVO) {
// 校验存在
validateonlyofExists(updateReqVO.getId());
// 更新
onlyofDO updateObj = BeanUtils.toBean(updateReqVO, onlyofDO.class);
onlyofMapper.updateById(updateObj);
}
@Override
public void deleteonlyof(Integer id) {
// 校验存在
validateonlyofExists(id);
// 删除
onlyofMapper.deleteById(id);
}
private void validateonlyofExists(Integer id) {
if (onlyofMapper.selectById(id) == null) {
throw exception(ONLYOF_NOT_EXISTS);
}
}
@Override
public onlyofDO getonlyof(Integer id) {
return onlyofMapper.selectById(id);
}
@Override
public PageResult<onlyofDO> getonlyofPage(onlyofPageReqVO pageReqVO) {
return onlyofMapper.selectPage(pageReqVO);
}
}

View File

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.iocoder.yudao.module.only.dal.mysql.only.onlyofMapper">
<!--
一般情况下,尽可能使用 Mapper 进行 CRUD 增删改查即可。
无法满足的场景,例如说多表关联查询,才使用 XML 编写 SQL。
代码生成器暂时只生成 Mapper XML 文件本身,更多推荐 MybatisX 快速开发插件来生成查询。
文档可见https://www.iocoder.cn/MyBatis/x-plugins/
-->
</mapper>

View File

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.iocoder.yudao.module.bpm.dal.mysql.star2.Star2Mapper">
<!--
一般情况下,尽可能使用 Mapper 进行 CRUD 增删改查即可。
无法满足的场景,例如说多表关联查询,才使用 XML 编写 SQL。
代码生成器暂时只生成 Mapper XML 文件本身,更多推荐 MybatisX 快速开发插件来生成查询。
文档可见https://www.iocoder.cn/MyBatis/x-plugins/
-->
</mapper>

View File

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.iocoder.yudao.module.bpm.dal.mysql.tbup.TbupMapper">
<!--
一般情况下,尽可能使用 Mapper 进行 CRUD 增删改查即可。
无法满足的场景,例如说多表关联查询,才使用 XML 编写 SQL。
代码生成器暂时只生成 Mapper XML 文件本身,更多推荐 MybatisX 快速开发插件来生成查询。
文档可见https://www.iocoder.cn/MyBatis/x-plugins/
-->
</mapper>

View File

@ -0,0 +1,26 @@
html {
height: 100%;
width: 100%;
}
body {
background: #fff;
color: #333;
font-family: Arial, Tahoma, sans-serif;
font-size: 12px;
font-weight: normal;
height: 100%;
margin: 0;
overflow-y: hidden;
padding: 0;
text-decoration: none;
}
.form {
height: 100%;
}
div {
margin: 0;
padding: 0;
}

View File

@ -0,0 +1,175 @@
var Editor = function () {
var docEditor;
var innerAlert = function (message) {
if (console && console.log)
console.log(message);
};
var onAppReady = function () {
innerAlert("文档编辑已就绪~");
};
var onDocumentStateChange = function (event) {
var title = document.title.replace(/\*$/g, "");
document.title = title + (event.data ? "*" : "");
};
var onError = function (event) {
if (event) {
innerAlert(event.data);
}
};
var onOutdatedVersion = function (event) {
//TODO
location.reload(true);
};
var onAppReady = function() {
console.log("ONLYOFFICE Document Editor is ready");
};
var onCollaborativeChanges = function () {
console.log("The document changed by collaborative user");
};
var onDocumentReady = function() {
console.log("Document is loaded");
};
var onDocumentStateChange = function (event) {
if (event.data) {
console.log("The document changed");
// docEditor.downloadAs();
} else {
console.log("Changes are collected on document editing service");
//
}
};
var onDownloadAs = function (event) {
console.log("ONLYOFFICE Document Editor create file: " + event.data);
window.top.postMessage(event.data);
createAndDownloadFile("test.docx",event.data)
};
window.addEventListener('message',function(e){
console.log(e.data)
if (e.data=="downloadAs") {
docEditor.downloadAs();
}
},false)
$("#insertImage").click(function(event) {
console.log("ONLYOFFICE Document Editor insertImage: "+ event.data);
docEditor.insertImage({
"fileType": "png",
"url": "http://192.168.0.58:20056/attachment/20190728测试上传文件名修改/2020January/1580363537940306800_small.png"
});
})
var onRequestInsertImage = function(event) {
console.log("ONLYOFFICE Document Editor insertImage" + event.data);
docEditor.insertImage({
"fileType": "png",
"url": "http://192.168.0.58:20056/attachment/20190728测试上传文件名修改/2020January/1580363537940306800_small.png"
});
};
var onError = function (event) {
console.log("ONLYOFFICE Document Editor reports an error: code " + event.data.errorCode + ", description " + event.data.errorDescription);
};
var onOutdatedVersion = function () {
location.reload(true);
};
var onRequestEditRights = function () {
console.log("ONLYOFFICE Document Editor requests editing rights");
// document.location.reload();
var he=location.href.replace("view","edit");
location.href=he;
};
//历史版本保留1个月。比如Unix时间戳Unix timestampexpires=1524547423
var onRequestHistory = function() {
};
var onRequestHistoryClose = function() {
document.location.reload();
};
var getUrlParam = function (name) {
//构造一个含有目标参数的正则表达式对象
var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)");
//匹配目标参数
var r = window.location.search.substr(1).match(reg);
//返回参数值
if (r != null) {
return decodeURI(r[2]);
}
return null;
};
var getDocumentConfig = function (document) {
if (document) {
return {
"document": document
};
}
innerAlert("文档未指定!");
return null;
};
var onRequestHistoryData = function() {}
var сonnectEditor = function (document, documentEditParam) {
var config = getDocumentConfig(document);
console.log(document)
console.log(documentEditParam)
config.width = "100%";
config.height = "100%";
config.events = {
"onAppReady": onAppReady,
"onDocumentStateChange": onDocumentStateChange,
"onError": onError,
"onOutdatedVersion": onOutdatedVersion
};
//config.documentType = ""+document.fileType
config.editorConfig = {
"lang": "zh-CN",
"mode": "edit",
"recent": [],
// 自定义一些配置
"customization": {
"chat": true, // 禁用聊天菜单按钮
"commentAuthorOnly": false, // 仅能编辑和删除其注释
"comments": false, // 隐藏文档注释菜单按钮
"compactHeader": false, // 隐藏附加操作按钮
"compactToolbar": false, // 完整工具栏(true代表紧凑工具栏)
"feedback": {
"visible": true // 隐藏反馈按钮
},
"forcesave": false, // true 表示强制文件保存请求添加到回调处理程序
"goback": false,/*{
"blank": true, // 转到文档时,在新窗口打开网站(false表示当前窗口打开)
"text": "转到文档位置(可以考虑放文档打开源页面)",
// 文档打开失败时的跳转也是该地址
"url": "http://www.lezhixing.com.cn"
},*/
"help": false, // 隐藏帮助按钮
"hideRightMenu": false, // 首次加载时隐藏右侧菜单(true 为显示)
"showReviewChanges": false, // 加载编辑器时自动显示/隐藏审阅更改面板(true显示 false隐藏)
"toolbarNoTabs": false, // 清楚地显示顶部工具栏选项卡(true 代表仅突出显示以查看选择了哪一个)
"zoom": 100 // 定义文档显示缩放百分比值
},
};
$.extend(config.editorConfig, documentEditParam);
console.log(config)
docEditor = new DocsAPI.DocEditor("iframeEditor",config);
};
return {
init: function (document, documentEditParam) {
console.log("-----сonnectEditor-----")
сonnectEditor(document, documentEditParam);
}
}
}();

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,26 @@
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org" lang="zh-CN">
<head>
<title th:text="${document.title}"></title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" type="text/css" th:href="@{/css/viewer.css}">
</head>
<!--//整个文件就是前端打开的编辑窗口的配置-->
<body>
<div class="form">
<div id="iframeEditor"></div>
<h1 th:text="${document.title}">Document Title</h1>
<pre th:text="${documentEditParam}">Document Edit Param</pre>
</div>
<script type="text/javascript" th:src="@{/js/jquery-1.8.2.js}"></script>
<script type="text/javascript" th:src="@{${documentServerApiJs}}"></script>
<script type="text/javascript" th:src="@{/js/editor.js}"></script>
<!-- 先通过 th:inline=“javascript” 添加到标签这样js代码即可访问model中的属性 -->
<script th:inline="javascript">
// js 中可以通过“[[${xxx}]]” 格式获得实际的值
Editor.init([[${document}]], [[${documentEditParam}]]);
</script>
<!-- <script type="text/javascript" src="http://192.168.1.15:7878/web-apps/apps/api/documents/api.js"></script>-->
</body>
</html>