修改 表头背景

master
zhangmeng 2021-11-10 17:54:03 +08:00
parent 1ea24fdccb
commit 6ebbe21fec
19 changed files with 359 additions and 48 deletions

View File

@ -288,4 +288,18 @@ public class UrlRequestController extends BaseController {
return this.jumpPage("admin/category/edit"); return this.jumpPage("admin/category/edit");
} }
@GetMapping("/file/index")
public ModelAndView file_index(){
return this.jumpPage("admin/file/list");
}
@GetMapping("/file/add")
public ModelAndView file_add(){
return this.jumpPage("admin/file/add");
}
@GetMapping("/file/upload")
public ModelAndView file_upload(){
return this.jumpPage("admin/file/upload");
}
} }

View File

@ -78,6 +78,8 @@ var article_batchRemove_url = gate_way_url + "/" + blog_url + "/article/batchRem
//----------------------------------------------------------------------------------------------------------------- //-----------------------------------------------------------------------------------------------------------------
//文件上传 //文件上传
var file_upload_url = gate_way_url + "/" + file_url + "/upload/file"; var file_upload_url = gate_way_url + "/" + file_url + "/upload/file";
//文件列表
var file_list_url = gate_way_url + "/" + file_url + "/file/list" ;
//---------------------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------------------------
//分类列表 //分类列表
var category_list_url = gate_way_url + "/" + blog_url + "/category/list"; var category_list_url = gate_way_url + "/" + blog_url + "/category/list";

View File

@ -5,9 +5,8 @@
<title>文章管理</title> <title>文章管理</title>
<link rel="stylesheet" href="${springMacroRequestContext.contextPath}/mystyle-cloud-admin-manager/system/component/pear/css/pear.css" /> <link rel="stylesheet" href="${springMacroRequestContext.contextPath}/mystyle-cloud-admin-manager/system/component/pear/css/pear.css" />
<style> <style>
.layui-table-cell{ .layui-table-header, .layui-table-header th {
display:table-cell; background-color: #d2d2d2 !important;
vertical-align: middle;
} }
</style> </style>
</head> </head>
@ -170,9 +169,8 @@
}, },
page: true, page: true,
cols: cols, cols: cols,
skin: 'line', skin: 'rows',
even: true, //开启隔行背景 even: true, //开启隔行背景
toolbar: '#article-toolbar', toolbar: '#article-toolbar',
defaultToolbar: [{ defaultToolbar: [{
title: '刷新', title: '刷新',

View File

@ -5,6 +5,11 @@
<title>分类管理</title> <title>分类管理</title>
<link rel="stylesheet" <link rel="stylesheet"
href="${springMacroRequestContext.contextPath}/mystyle-cloud-admin-manager/system/component/pear/css/pear.css"/> href="${springMacroRequestContext.contextPath}/mystyle-cloud-admin-manager/system/component/pear/css/pear.css"/>
<style>
.layui-table-header, .layui-table-header th {
background-color: #d2d2d2 !important;
}
</style>
</head> </head>
<body class="pear-container"> <body class="pear-container">
<div class="layui-card"> <div class="layui-card">
@ -120,7 +125,7 @@
}, },
page: true, page: true,
cols: cols, cols: cols,
skin: 'line', skin: 'rows',
toolbar: '#category-toolbar', toolbar: '#category-toolbar',
defaultToolbar: [{ defaultToolbar: [{
title: '刷新', title: '刷新',

View File

@ -3,11 +3,10 @@
<head> <head>
<meta charset="utf-8"> <meta charset="utf-8">
<title>文件管理</title> <title>文件管理</title>
<link rel="stylesheet" href="${springMacroRequestContext.contextPath}/system/component/pear/css/pear.css" /> <link rel="stylesheet" href="${springMacroRequestContext.contextPath}/mystyle-cloud-admin-manager/system/component/pear/css/pear.css" />
<style> <style>
.layui-table-cell{ .layui-table-header, .layui-table-header th {
display:table-cell; background-color: #d2d2d2 !important;
vertical-align: middle;
} }
</style> </style>
</head> </head>
@ -90,8 +89,9 @@
{{# } }} {{# } }}
</script> </script>
<script src="${springMacroRequestContext.contextPath}/system/component/layui/layui.js"></script> <script src="${springMacroRequestContext.contextPath}/mystyle-cloud-admin-manager/system/component/layui/layui.js"></script>
<script src="${springMacroRequestContext.contextPath}/system/component/pear/pear.js"></script> <script src="${springMacroRequestContext.contextPath}/mystyle-cloud-admin-manager/system/component/pear/pear.js"></script>
<script src="${springMacroRequestContext.contextPath}/mystyle-cloud-admin-manager/system/admin/js/mystyle-admin.js"></script>
<script> <script>
layui.use(['table', 'form', 'jquery','common'], function() { layui.use(['table', 'form', 'jquery','common'], function() {
let table = layui.table; let table = layui.table;
@ -99,8 +99,6 @@
let $ = layui.jquery; let $ = layui.jquery;
let common = layui.common; let common = layui.common;
let token = localStorage.getItem("token");
let cols = [ let cols = [
[{ [{
type: 'checkbox' type: 'checkbox'
@ -110,14 +108,14 @@
field: 'addTime', field: 'addTime',
align: 'center', align: 'center',
templet: '#file-addTime', templet: '#file-addTime',
width: 180 width: 100
}, },
{ {
title: '文件名称', title: '文件名称',
field: 'name', field: 'name',
align: 'center', align: 'center',
width: 280 width: 200
}, },
{ {
title: '文件类型', title: '文件类型',
@ -131,6 +129,7 @@
title: '文件大小', title: '文件大小',
field: 'fileSize', field: 'fileSize',
align: 'center', align: 'center',
width:100
}, },
{ {
@ -138,38 +137,43 @@
field: 'path', field: 'path',
align: 'center', align: 'center',
templet: '#file-view', templet: '#file-view',
width: 100 width: 156
}, },
{ {
title: '图片的宽度', title: '图片的宽度',
field: 'imageWidth', field: 'imageWidth',
align: 'center' align: 'center',
width: 100
}, },
{ {
title: '图片的高度', title: '图片的高度',
field: 'imageHeight', field: 'imageHeight',
align: 'center' align: 'center',
width: 100
}, },
{ {
title: '视频的封面', title: '视频的封面',
field: 'videoImages', field: 'videoImages',
align: 'center' align: 'center',
width: 156
}, },
{ // {
title: '视频封面的宽', // title: '视频封面的宽',
field: 'videoImagesWidth', // field: 'videoImagesWidth',
align: 'center' // align: 'center',
}, // width: 100
// },
{ //
title: '视频封面的高', // {
field: 'videoImagesHeight', // title: '视频封面的高',
align: 'center' // field: 'videoImagesHeight',
}, // align: 'center',
// width: 100
// },
{ {
title: '操作', title: '操作',
toolbar: '#file-bar', toolbar: '#file-bar',
@ -181,12 +185,13 @@
table.render({ table.render({
elem: '#file-table', elem: '#file-table',
url: '/file/list', url: file_list_url,
headers: {token: localStorage.getItem("token")}, headers: {
access_token:access_token
},
page: true, page: true,
cols: cols, cols: cols,
skin: 'line', skin: 'rows',
toolbar: '#file-toolbar', toolbar: '#file-toolbar',
defaultToolbar: [{ defaultToolbar: [{
title: '刷新', title: '刷新',

View File

@ -4,6 +4,11 @@
<meta charset="UTF-8"> <meta charset="UTF-8">
<title>权限管理</title> <title>权限管理</title>
<link rel="stylesheet" href="${springMacroRequestContext.contextPath}/mystyle-cloud-admin-manager/system/component/pear/css/pear.css"/> <link rel="stylesheet" href="${springMacroRequestContext.contextPath}/mystyle-cloud-admin-manager/system/component/pear/css/pear.css"/>
<style>
.layui-table-header, .layui-table-header th {
background-color: #d2d2d2 !important;
}
</style>
</head> </head>
<body class="pear-container"> <body class="pear-container">
<div class="layui-card"> <div class="layui-card">
@ -98,7 +103,7 @@
treeSpid: 0, treeSpid: 0,
treeIdName: 'id', treeIdName: 'id',
treePidName: 'parent_id', treePidName: 'parent_id',
skin: 'line', skin: 'rows',
method: 'post', method: 'post',
treeDefaultClose: true, treeDefaultClose: true,
toolbar: '#power-toolbar', toolbar: '#power-toolbar',

View File

@ -4,6 +4,11 @@
<meta charset="utf-8"> <meta charset="utf-8">
<title>角色管理</title> <title>角色管理</title>
<link href="${springMacroRequestContext.contextPath}/mystyle-cloud-admin-manager/system/component/pear/css/pear.css" rel="stylesheet"/> <link href="${springMacroRequestContext.contextPath}/mystyle-cloud-admin-manager/system/component/pear/css/pear.css" rel="stylesheet"/>
<style>
.layui-table-header, .layui-table-header th {
background-color: #d2d2d2 !important;
}
</style>
</head> </head>
<body class="pear-container"> <body class="pear-container">
<div class="layui-card"> <div class="layui-card">
@ -142,7 +147,7 @@
url: role_list_url, url: role_list_url,
page: true, page: true,
cols: cols, cols: cols,
skin: 'line', skin: 'rows',
even: true, //开启隔行背景 even: true, //开启隔行背景
toolbar: '#role-toolbar', toolbar: '#role-toolbar',
defaultToolbar: [{ defaultToolbar: [{

View File

@ -4,6 +4,11 @@
<meta charset="utf-8"> <meta charset="utf-8">
<title>用户管理</title> <title>用户管理</title>
<link rel="stylesheet" href="${springMacroRequestContext.contextPath}/mystyle-cloud-admin-manager/system/component/pear/css/pear.css" /> <link rel="stylesheet" href="${springMacroRequestContext.contextPath}/mystyle-cloud-admin-manager/system/component/pear/css/pear.css" />
<style>
.layui-table-header, .layui-table-header th {
background-color: #d2d2d2 !important;
}
</style>
</head> </head>
<body class="pear-container"> <body class="pear-container">
<div class="layui-card"> <div class="layui-card">
@ -152,7 +157,7 @@
url: user_list_url, url: user_list_url,
page: true, page: true,
cols: cols, cols: cols,
skin: 'line', skin: 'rows',
toolbar: '#user-toolbar', toolbar: '#user-toolbar',
defaultToolbar: [{ defaultToolbar: [{
title: '刷新', title: '刷新',

View File

@ -0,0 +1,26 @@
package com.zhangmeng.api.service.file;
import com.zhangmeng.model.vo.Result;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import javax.servlet.http.HttpServletResponse;
@Api(tags = "文件管理")
public interface FileControllerApi {
@ApiOperation("文件列表")
public Result list(Integer pageNum, Integer pageSize, String name);
@ApiOperation("删除文件")
public Result delete( String fileId);
@ApiOperation("批量删除文章")
public Result batchRemove( String ids);
@ApiOperation("文件在线预览")
public void onlinePreview(@RequestParam("url") String url, HttpServletResponse response);
}

View File

@ -97,5 +97,9 @@
<groupId>org.bytedeco</groupId> <groupId>org.bytedeco</groupId>
<artifactId>ffmpeg-platform</artifactId> <artifactId>ffmpeg-platform</artifactId>
</dependency> </dependency>
<dependency>
<groupId>com.artofsolving</groupId>
<artifactId>jodconverter</artifactId>
</dependency>
</dependencies> </dependencies>
</project> </project>

View File

@ -0,0 +1,37 @@
package com.zhangmeng.file.config;
import feign.RequestInterceptor;
import feign.RequestTemplate;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
import java.util.Enumeration;
/**
*
*/
@Configuration
public class FeignOauth2RequestInterceptor implements RequestInterceptor {
@Override
public void apply(RequestTemplate requestTemplate) {
// 获取的全部请求信息
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
if (attributes != null){
HttpServletRequest request = attributes.getRequest();
// 获取所有的请求头信息
Enumeration<String> headerNames = request.getHeaderNames();
if (headerNames != null){
while (headerNames.hasMoreElements()){
// 获取请求头的key
String element = headerNames.nextElement();
// 获取请求头的value
String value = request.getHeader(element);
// 将请求头信息放入到请求头
requestTemplate.header(element,value);
}
}
}
}
}

View File

@ -79,15 +79,7 @@ public class ResourceServerConfig extends ResourceServerConfigurerAdapter {
@Override @Override
public void configure(HttpSecurity http) throws Exception { public void configure(HttpSecurity http) throws Exception {
/** http.headers().frameOptions().disable();
* - /swagger-ui.html
* - /swagger-ui/**
* - /swagger-resources/**
* - /v2/api-docs
* - /v3/api-docs
* - /doc.html
* - /webjars/springfox-swagger-ui/**
*/
// 所有请求必须认证通过 // 所有请求必须认证通过
http.authorizeRequests() http.authorizeRequests()

View File

@ -0,0 +1,77 @@
package com.zhangmeng.file.controller;
import com.github.pagehelper.PageInfo;
import com.zhangmeng.api.service.file.FileControllerApi;
import com.zhangmeng.file.feign.UserFeignService;
import com.zhangmeng.file.service.FileInfoService;
import com.zhangmeng.model.base.baseController.BaseController;
import com.zhangmeng.model.base.baseUtil.CommonUtil;
import com.zhangmeng.model.dto.query.QueryParams;
import com.zhangmeng.model.entity.FileInfo;
import com.zhangmeng.model.entity.User;
import com.zhangmeng.model.vo.Result;
import com.zhangmeng.model.vo.StatusCode;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import tk.mybatis.mapper.entity.Condition;
import tk.mybatis.mapper.entity.Example;
import javax.servlet.http.HttpServletResponse;
import java.util.Objects;
@RestController
@RequestMapping("/file")
public class FileController extends BaseController implements FileControllerApi {
@Autowired
private FileInfoService fileInfoService;
@Autowired
private UserFeignService userFeignService;
@Override
@GetMapping("/list")
public Result list(Integer pageNum, Integer pageSize, String name){
Condition condition = new Condition(FileInfo.class);
Example.Criteria criteria = condition.createCriteria();
User user = userFeignService.getCurrentUser();
criteria.andEqualTo("user_id", Objects.requireNonNull(user).getId());
if (CommonUtil.isNotNull(name)){
criteria.andLike("name","%"+ name + "%");
}
PageInfo<FileInfo> pageInfo = this.fileInfoService.findByCondition(new QueryParams(pageNum, pageSize, condition),true);
return new Result(true, StatusCode.OK,"查询成功",pageInfo.getTotal(),pageInfo.getList());
}
@Override
@PostMapping("/delete")
public Result delete( String fileId) {
if (CommonUtil.isNotNull(fileId)){
this.fileInfoService.deleteById(Long.parseLong(fileId));
}
return new Result(true, StatusCode.OK,"删除成功");
}
@Override
@PostMapping("/batchRemove")
public Result batchRemove( String ids) {
String id_s = CommonUtil.firstLastComma(ids);
String[] strings = id_s.split(",");
if (strings.length > 0){
for (String id : strings) {
this.fileInfoService.deleteById(Long.parseLong(id));
}
}
return new Result(true,StatusCode.OK,"删除成功");
}
@Override
@GetMapping("/onlinePreview")
public void onlinePreview(@RequestParam("url") String url, HttpServletResponse response){
this.fileInfoService.onlinePreview(url,response);
}
}

View File

@ -10,7 +10,7 @@ import org.springframework.web.bind.annotation.RequestParam;
import java.util.List; import java.util.List;
@FeignClient(SysConstant.mystyle_cloud_admin_manager) @FeignClient(value = SysConstant.mystyle_cloud_admin_manager)
public interface UserFeignService { public interface UserFeignService {
@RequestMapping("/user/findByUserName") @RequestMapping("/user/findByUserName")
@ -18,4 +18,7 @@ public interface UserFeignService {
@RequestMapping("/permission/findByUserId") @RequestMapping("/permission/findByUserId")
List<Permission> findByUserId(@RequestParam(value = "id", defaultValue = "forezp",required = false)Long id); List<Permission> findByUserId(@RequestParam(value = "id", defaultValue = "forezp",required = false)Long id);
@GetMapping("/user/current")
public User getCurrentUser();
} }

View File

@ -3,6 +3,8 @@ package com.zhangmeng.file.service;
import com.zhangmeng.model.base.baseService.BaseService; import com.zhangmeng.model.base.baseService.BaseService;
import com.zhangmeng.model.entity.FileInfo; import com.zhangmeng.model.entity.FileInfo;
import javax.servlet.http.HttpServletResponse;
/** /**
* @author zhangmeng * @author zhangmeng
* @date 202171310:38:35 * @date 202171310:38:35
@ -12,4 +14,5 @@ public interface FileInfoService extends BaseService<FileInfo> {
FileInfo findByMd5(String md5); FileInfo findByMd5(String md5);
void onlinePreview(String url, HttpServletResponse response);
} }

View File

@ -1,6 +1,7 @@
package com.zhangmeng.file.service.impl; package com.zhangmeng.file.service.impl;
import com.zhangmeng.file.service.FileInfoService; import com.zhangmeng.file.service.FileInfoService;
import com.zhangmeng.file.utils.FileUtil;
import com.zhangmeng.model.base.baseService.impl.AbstractBaseServiceImpl; import com.zhangmeng.model.base.baseService.impl.AbstractBaseServiceImpl;
import com.zhangmeng.model.base.baseUtil.CommonUtil; import com.zhangmeng.model.base.baseUtil.CommonUtil;
import com.zhangmeng.model.entity.FileInfo; import com.zhangmeng.model.entity.FileInfo;
@ -9,6 +10,9 @@ import org.springframework.stereotype.Service;
import tk.mybatis.mapper.entity.Condition; import tk.mybatis.mapper.entity.Condition;
import tk.mybatis.mapper.entity.Example; import tk.mybatis.mapper.entity.Example;
import javax.servlet.http.HttpServletResponse;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.List; import java.util.List;
@ -28,4 +32,34 @@ public class FileInfoServiceImpl extends AbstractBaseServiceImpl<FileInfo> imple
} }
return null; return null;
} }
@Override
public void onlinePreview(String url, HttpServletResponse response) {
try {
//获取文件类型
String suffix = CommonUtil.guessContentTypeFromStream(url);
if(!suffix.equals("txt") && !suffix.equals("doc") && !suffix.equals("docx") && !suffix.equals("xls")
&& !suffix.equals("xlsx") && !suffix.equals("ppt") && !suffix.equals("pptx")){
throw new RuntimeException("文件格式不支持预览");
}
InputStream in= FileUtil.convertNetFile(url,suffix);
OutputStream outputStream = response.getOutputStream();
//创建存放文件内容的数组
byte[] buff =new byte[1024];
//所读取的内容使用n来接收
int n;
//当没有读取完时,继续读取,循环
while((n=in.read(buff))!=-1){
//将字节数组的数据全部写入到输出流中
outputStream.write(buff,0,n);
}
//强制将缓存区的数据进行输出
outputStream.flush();
//关流
outputStream.close();
in.close();
} catch (Exception e) {
e.printStackTrace();
}
}
} }

View File

@ -34,10 +34,19 @@ import java.awt.image.BufferedImage;
import java.awt.image.DataBufferByte; import java.awt.image.DataBufferByte;
import java.awt.image.RenderedImage; import java.awt.image.RenderedImage;
import java.io.*; import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import com.zhangmeng.model.dto.baidu.LatAndLngToAddress; import com.zhangmeng.model.dto.baidu.LatAndLngToAddress;
import com.artofsolving.jodconverter.DefaultDocumentFormatRegistry;
import com.artofsolving.jodconverter.DocumentConverter;
import com.artofsolving.jodconverter.DocumentFormat;
import com.artofsolving.jodconverter.openoffice.connection.OpenOfficeConnection;
import com.artofsolving.jodconverter.openoffice.connection.SocketOpenOfficeConnection;
import com.artofsolving.jodconverter.openoffice.converter.StreamOpenOfficeDocumentConverter;
/** /**
@ -690,4 +699,63 @@ public class FileUtil {
mat.put(0, 0, pixels); mat.put(0, 0, pixels);
return mat; return mat;
} }
/**
* officePDF()
*
* @param netFileUrl
* @param suffix
* @return InputStream
* @author tarzan
*/
public static InputStream convertNetFile(String netFileUrl, String suffix) throws Exception {
// 创建URL
URL url = new URL(netFileUrl);
// 试图连接并取得返回状态码
URLConnection urlconn = url.openConnection();
urlconn.connect();
HttpURLConnection httpconn = (HttpURLConnection) urlconn;
int httpResult = httpconn.getResponseCode();
if (httpResult == HttpURLConnection.HTTP_OK) {
InputStream inputStream = urlconn.getInputStream();
return covertCommonByStream(inputStream, suffix);
}
return null;
}
/** 默认转换后文件后缀 */
private static final String DEFAULT_SUFFIX = "pdf";
/** openoffice_port */
private static final Integer OPENOFFICE_PORT = 8100;
/**
*
*
* @param inputStream
* @param suffix
* @return InputStream
* @author tarzan
*/
public static InputStream covertCommonByStream(InputStream inputStream, String suffix) throws Exception {
ByteArrayOutputStream out = new ByteArrayOutputStream();
OpenOfficeConnection connection = new SocketOpenOfficeConnection(OPENOFFICE_PORT);
connection.connect();
DocumentConverter converter = new StreamOpenOfficeDocumentConverter(connection);
DefaultDocumentFormatRegistry formatReg = new DefaultDocumentFormatRegistry();
DocumentFormat targetFormat = formatReg.getFormatByFileExtension(DEFAULT_SUFFIX);
DocumentFormat sourceFormat = formatReg.getFormatByFileExtension(suffix);
converter.convert(inputStream, sourceFormat, out, targetFormat);
connection.disconnect();
return outputStreamConvertInputStream(out);
}
/**
* outputStreaminputStream
*
* @author tarzan
*/
public static ByteArrayInputStream outputStreamConvertInputStream(final OutputStream out) throws Exception {
ByteArrayOutputStream baos=(ByteArrayOutputStream) out;
return new ByteArrayInputStream(baos.toByteArray());
}
} }

View File

@ -2,6 +2,10 @@ package com.zhangmeng.model.base.baseUtil;
import com.zhangmeng.model.dto.date.DateBean; import com.zhangmeng.model.dto.date.DateBean;
import java.io.BufferedInputStream;
import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.text.ParseException; import java.text.ParseException;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.time.*; import java.time.*;
@ -342,4 +346,21 @@ public class CommonUtil {
} }
} }
public static String guessContentTypeFromStream(String str_url) {
try {
BufferedInputStream bis = null;
HttpURLConnection urlconnection = null;
URL url = null;
url = new URL(str_url);
urlconnection = (HttpURLConnection) url.openConnection();
urlconnection.connect();
bis = new BufferedInputStream(urlconnection.getInputStream());
String type = HttpURLConnection.guessContentTypeFromStream(bis);
urlconnection.disconnect();
return type;
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
} }

View File

@ -55,6 +55,7 @@
<ffmpeg-platform.version>4.2.1-1.5.2</ffmpeg-platform.version> <ffmpeg-platform.version>4.2.1-1.5.2</ffmpeg-platform.version>
<fastjson.version>1.2.75</fastjson.version> <fastjson.version>1.2.75</fastjson.version>
<jwt.version>0.9.1</jwt.version> <jwt.version>0.9.1</jwt.version>
<jodconverter.version>2.2.1</jodconverter.version>
</properties> </properties>
<dependencyManagement> <dependencyManagement>
@ -205,6 +206,12 @@
<artifactId>jjwt</artifactId> <artifactId>jjwt</artifactId>
<version>${jwt.version}</version> <version>${jwt.version}</version>
</dependency> </dependency>
<!--openoffice-->
<dependency>
<groupId>com.artofsolving</groupId>
<artifactId>jodconverter</artifactId>
<version>${jodconverter.version}</version>
</dependency>
</dependencies> </dependencies>
</dependencyManagement> </dependencyManagement>
</project> </project>