163 Commits

Author SHA1 Message Date
sswiki
4784a8d991 !41 add postgresql support
Merge pull request !41 from runner-mei/master
2024-11-30 12:28:31 +00:00
mfk
2c1297430b add postgresql support 2024-11-25 21:17:31 +08:00
sswiki
9de02903aa !40 add postgresql support
Merge pull request !40 from runner-mei/master
2024-11-25 01:30:43 +00:00
runner-mei
0fad018101 add pg_full.sql
Signed-off-by: runner-mei <run_mei@163.com>
2024-11-24 04:01:56 +00:00
sswiki
55ca2a2e43 增加宝塔部署方式
Signed-off-by: sswiki <1773266885@qq.com>
2024-10-26 03:25:22 +00:00
sswiki
d5300d4d76 增加宝塔部署方式
Signed-off-by: sswiki <1773266885@qq.com>
2024-10-26 03:23:30 +00:00
sswiki
802972abd2 修改编码 2024-07-06 19:02:39 +08:00
sswiki
57d560b9ec 去掉类型,使用默认的类型
Signed-off-by: sswiki <1773266885@qq.com>
2024-07-05 15:38:26 +00:00
sswiki
26c0f83bad !39 fix:修复mime-types拼写错误问题
Merge pull request !39 from 裴永鹏/master
2024-07-05 15:37:48 +00:00
peiyp
e8394fac8e fix:修复mime-types拼写错误问题 2024-07-05 23:23:45 +08:00
sswiki
6769fdaa59 build 2024-06-25 19:34:37 +08:00
sswiki
f5d32c6114 优化word文档的导出 2024-06-25 19:29:44 +08:00
sswiki
bdeab06d6c #I9FSZ3 解决导出word没有图片的问题 2024-04-22 21:36:51 +08:00
sswiki
6f24c765ff 修复开放文档将文档内的图片展示为附件的问题 2024-03-08 10:51:31 +08:00
sswiki
b31104112c 修复删除页面时将子页面的名字改为了父目录名称的问题 2024-02-18 10:01:24 +08:00
sswiki
888a2106de 修改模板表SQL 2023-11-24 09:54:45 +08:00
sswiki
feebc250d7 !38 对一大波idea提醒需要优化的地方进行处理
Merge pull request !38 from handy/handy
2023-11-24 01:46:37 +00:00
handy
efa2538736 对一大波idea提醒需要优化的地方进行处理 2023-11-23 16:25:59 +08:00
sswiki
8b1fb129ce update README.md.
Signed-off-by: sswiki <1773266885@qq.com>
2023-10-27 06:53:28 +00:00
sswiki
c28b7a7585 update README.md.
Signed-off-by: sswiki <1773266885@qq.com>
2023-10-27 06:39:51 +00:00
sswiki
abcec4c846 update README.md.
Signed-off-by: sswiki <1773266885@qq.com>
2023-10-27 06:29:02 +00:00
sswiki
2c66ad1b1a 新建 resource 2023-10-27 06:18:52 +00:00
sswiki
7597bdc52e 1.1.6 release 2023-10-17 22:43:20 +08:00
sswiki
84742639db build & 1.1.5 release 2023-10-15 08:36:55 +08:00
sswiki
5a25be99cb 修改配置项 2023-10-07 15:04:55 +08:00
sswiki
346c63d55f #I85QPE 处理附件列表问题,优化文件上传逻辑 2023-10-07 15:02:52 +08:00
Sh1yu
de11195aa9 规范代码 2023-09-28 10:57:37 +08:00
sswiki
252d8d23e1 文档展示样式优化 2023-09-26 19:53:51 +08:00
sswiki
75577350ba 文档展示样式优化 2023-09-26 16:13:45 +08:00
Sh1yu
66904f0bb4 修改界面右侧顶部边栏样式,编译前端工程 2023-09-25 10:33:42 +08:00
Sh1yu
eda883a9bf 1.前端代码拆分整理
2.合并统一配色方案
3.修改所有功能按钮为右上角图标
4.修改附件到文档相关按钮内
2023-09-20 09:31:38 +08:00
Sh1yu
35b4e2806b 提交,文件夹状态下点击,右侧显示文件夹下的最新文档 2023-09-20 09:27:17 +08:00
sh1yu
221e38f28a !37 修复移动文档时没有绑定模板会报空的问题
Merge pull request !37 from sh1yu/master
2023-08-25 02:29:14 +00:00
Sh1yu
4a93ad5f48 修复移动文档时没有绑定模板会报空的问题 2023-08-25 10:27:56 +08:00
sh1yu
84d94917e5 !36 新增模板相关功能
Merge pull request !36 from sh1yu/master
2023-08-24 07:20:02 +00:00
Sh1yu
7e85a55f67 补充后续发行版的升级sql 2023-08-24 15:18:00 +08:00
Sh1yu
371c5a4ad4 新增模板相关功能 2023-08-24 14:59:06 +08:00
Sh1yu
fdb01114e3 新增模板相关功能 2023-08-24 14:41:48 +08:00
Sh1yu
ffbbe33a9f 新增模板相关功能 2023-08-24 09:28:16 +08:00
sh1yu
76e820d660 !35 左边栏组件化、新增移动功能模块
Merge pull request !35 from sh1yu/master
2023-08-16 02:53:35 +00:00
Sh1yu
e393a71a93 左边栏组件化,新增文档移动功能 2023-08-16 09:51:42 +08:00
Sh1yu
90b8b117c4 Merge branch 'master' of https://gitee.com/sh1yu/zyplayer-doc 2023-08-16 09:14:54 +08:00
Sh1yu
8b3d86b18e 组件化、移动模块提交 2023-08-15 17:02:02 +08:00
sh1yu
718939e59b !34 添加菜单组件化
Merge pull request !34 from sh1yu/master
2023-08-08 08:28:49 +00:00
Sh1yu
0fa8c58c7e 添加菜单代码组件化 2023-08-08 15:55:56 +08:00
sswiki
effff9a723 修改数据互导查询总条数时某些数据库将别名大写了的问题 2023-08-07 11:11:55 +08:00
sswiki
a9cabd9ffe 修复判空问题 2023-08-03 16:52:22 +08:00
sswiki
a679130a93 优化页面树的展示 2023-08-02 16:32:39 +08:00
sh1yu
355b80c438 !33 修改文件夹展示问题,修改文件夹删除问题
Merge pull request !33 from sh1yu/master
2023-08-01 03:14:47 +00:00
Sh1yu
1cb19841a8 修改文件夹展示问题和文件夹删除问题 2023-08-01 10:45:48 +08:00
sh1yu
ea49f9d181 !32 批量上传功能合并
Merge pull request !32 from sh1yu/master
1.优化重命名图标等展示
2.新增MD文件的单个上传和批量上传
3.文件导入架子搭建
2023-07-31 08:41:50 +00:00
Sh1yu
901a165fb1 Merge branch 'master' of https://gitee.com/sh1yu/zyplayer-doc 2023-07-31 16:18:16 +08:00
Sh1yu
98e8bccf3d 1.优化上次提交wiki条目右侧菜单栏展示效果
2.新增对于md的单个导入和批量导入
3.单个导入和批量导入的架子搭好
2023-07-31 16:15:16 +08:00
sh1yu
65a52de3f2 !31 基础功能更新
Merge pull request !31 from sh1yu/master
2023-07-28 06:31:17 +00:00
Sh1yu
55b042c6d8 1.图标功能
2.文件加功能
3.重命名功能
引入avtdv
2023-07-28 10:41:29 +08:00
diant
931a71c54f 修复sql执行器页面取消执行未能正确运行的问题
sse推送模块已知问题修复
2023-07-19 15:07:59 +08:00
diant
d27c2b57d1 sse推送模块代码优化 2023-07-18 16:14:09 +08:00
diant
9fa5c8e6a5 db新增sse推送模块 2023-07-17 18:32:47 +08:00
暮光:城中城
1dd7dd0975 代码拆分,相关逻辑开发 2023-07-04 20:15:32 +08:00
暮光:城中城
86af800f13 !28 合并闭源版wiki相关逻辑,优化新建文档的显示问题
Merge pull request !28 from sh1yu/master
2023-07-04 11:06:06 +00:00
Sh1yu
edf024fe1c 合并闭源版wiki相关逻辑,优化新建文档的显示问题 2023-07-04 16:46:22 +08:00
Sh1yu
f939fc5164 编辑按钮修复 2023-07-04 16:38:50 +08:00
sswiki
c85e9b1865 样式优化 2023-07-03 23:55:14 +08:00
暮光:城中城
62e235f206 优化文档展示页面,代码拆分 2023-07-03 20:19:27 +08:00
暮光:城中城
4da877e911 修改说明 2023-07-03 19:51:59 +08:00
暮光:城中城
d574f5c8de !26 合并闭源版功能,创建文档时上传文件也能绑定到page上
Merge pull request !26 from sh1yu/master
2023-07-03 10:58:38 +00:00
Sh1yu
f7773e2ec6 合并闭源版功能,创建文档时上传文件也能绑定到page上 2023-06-29 10:42:11 +08:00
Sh1yu
49d697347a 合并闭源版功能,创建文档时上传文件也能绑定到page上 2023-06-27 16:43:33 +08:00
diant
80c9299532 postgresql已知问题修复
postgresql支持表数据页面直接修改数据
2023-06-21 10:03:10 +08:00
暮光:城中城
705c2499db !24 修改启动配置问题,合并闭源版wiki模块生成doc的代码
Merge pull request !24 from sh1yu/master
2023-06-20 09:17:13 +00:00
Sh1yu
d03a1fa746 合并闭源版对于生成doc的代码 2023-06-20 16:33:47 +08:00
Sh1yu
3211aa98f1 修改启动状态获取类名,原类名错误 2023-06-20 15:43:27 +08:00
diant
4f4b976b5b 修复sql执行器未能正确返回错误信息的问题
表数据页面oracle支持直接修改数据
2023-06-19 16:59:51 +08:00
暮光:城中城
03848fd2d0 !23 优化代码,修改拼写错误
Merge pull request !23 from sh1yu/master
2023-06-19 03:06:17 +00:00
Sh1yu
8facbf5fa0 代码优化,以及拼写错误修改 2023-06-19 09:42:11 +08:00
暮光:城中城
9f11339b7c !22 代码修改
Merge pull request !22 from sh1yu/master
2023-06-16 14:54:11 +00:00
diant
b7595dc766 db模块-表数据页面支持直接修改数据(暂只支持达梦数据库) 2023-06-16 18:42:21 +08:00
Sh1yu
814fde5ab5 1.修改启动类打印,让启动类简洁,让打印内容可扩展
2.使用配置文件配合注解操作模块化的加载,可以通过配置文件控制加载哪些模块,同时前端隐藏未开启模块
2023-06-16 17:45:29 +08:00
Sh1yu
270886a3ab 修改模块化加载,可以通过配置文件控制加载哪些模块,同时前端有对应显示 2023-06-15 15:48:56 +08:00
diant
87e41e91c1 db模块页面体验优化 2023-06-09 14:13:36 +08:00
diant
a9e1766b05 db模块增加节流、防抖函数,有效提升页面性能
拖拽条样式美化
2023-06-07 18:40:46 +08:00
diant
9e68547cfb db模块引入虚拟滚动树组件,改善大数据量下的性能问题
一些细节优化
2023-06-07 14:49:41 +08:00
sswiki
cd9a87b7df 修复删除文件后未更新文件列表问题 2023-06-05 21:48:34 +08:00
diant
9e063e280c db模块数据库列表增加关键词搜索
其他细节调整
2023-06-05 18:19:28 +08:00
diant
a95c1a2be1 数据源管理智能填入优化 2023-06-02 18:33:59 +08:00
diant
5699d614df 修复样式污染导致的表数据页面无法正常显示数据问题 2023-06-02 15:17:52 +08:00
diant
9dfabe54ce sql执行器页面布局拖拽优化 2023-06-02 11:21:19 +08:00
diant
6e4b226a46 sql执行器增加上下布局拖拽 2023-06-01 21:37:26 +08:00
diant
76c8b83284 oracle,达梦已知sql异常修复
冗余代码优化
2023-05-30 18:18:48 +08:00
diant
289a42b7d4 oracle,达梦数据库获取表字段sql修复 2023-05-29 18:29:31 +08:00
diant
5093b0eea6 oracle,达梦数据库表列表排序
表数据页面横向拖动卡顿问题修复
一些页面调整
2023-05-26 18:26:22 +08:00
diant
00e3a4492d oracle DDL语句格式化 2023-05-25 18:04:02 +08:00
diant
8839afb0e8 db模块tab页面右键菜单已知问题修复 2023-05-24 17:14:08 +08:00
diant
e456d4e95e db模块tab页面增加右键菜单 2023-05-24 16:44:29 +08:00
diant
960eccd165 sql执行器页面刷新记住数据库,可同时存在多个数据库执行器页面 2023-05-23 14:00:00 +08:00
diant
a02aa870ae 数据源管理页面-新增与修改页面:增加智能填入功能
sql执行器页面刷新记住数据源,可同时存在多个数据源执行器页面
2023-05-22 18:32:42 +08:00
diant
6642ba24cc sql执行器性能优化 2023-05-18 17:06:20 +08:00
diant
f74e53c7ea 表数据页面优化
已知问题修复
2023-05-17 23:48:26 +08:00
diant
98aa22f6a6 sql执行器页面易用性优化
一些页面美化
2023-05-16 18:38:42 +08:00
diant
aaaa8b4e4d 达梦,oracle<条件查询表字段sql>报错修复 2023-05-15 11:30:56 +08:00
diant
093b1b5b82 sql执行器页面表格字段滚动条隐藏 2023-05-12 18:13:59 +08:00
diant
114d224cbf 修复oracle数据库字段大小混写导致表数据结果页面报错问题
db模块全局滚动条美化
2023-05-12 15:08:48 +08:00
暮光:城中城
41b1426132 !20 添加rewriteBatchedStatements=true提高批量操作数据库效率
Merge pull request !20 from handy/handy
2023-05-12 03:23:48 +00:00
handy
f70a863b62 添加rewriteBatchedStatements=true提高批量操作数据库效率 2023-05-12 11:16:17 +08:00
sswiki
2c80f3a894 V1.1.5 release 2023-05-08 23:24:19 +08:00
sswiki
6a458e8136 修改后端端口 2023-05-08 23:08:39 +08:00
暮光:城中城
eb00388b6c 去掉不需要的依赖 2023-05-08 22:53:06 +08:00
暮光:城中城
91bd860440 build 2023-05-04 20:24:50 +08:00
暮光:城中城
4354e1e388 修改文档地址 2023-05-04 20:19:19 +08:00
暮光:城中城
43be458728 #I6Z8UX 解决表格样式问题 2023-05-04 19:57:35 +08:00
暮光:城中城
ff2591adaa #I6Z8UX 解决列表样式问题,修复保存后文档加载问题 2023-05-04 19:46:28 +08:00
暮光:城中城
8fc9770e6d 移出oracle依赖,需要的话可自行添加 2023-04-10 20:03:57 +08:00
暮光:城中城
6d3df324ed build 2023-04-01 19:13:13 +08:00
暮光:城中城
be8dae345c 修复图片查看问题 2023-04-01 17:49:53 +08:00
暮光:城中城
d2ff37c7f6 #I6S5YA build解决路由错误问题 2023-04-01 16:21:40 +08:00
暮光:城中城
f95ca14ec8 修改路由和提示文案 2023-03-28 08:31:56 +08:00
暮光:城中城
5b01d3274a !13 升级fastjson版本到1.2.83,1.2.83版本之前存在代码执行漏洞风险,CVE-2022-25845
Merge pull request !13 from mnwexxx/N/A
2023-03-26 10:27:20 +00:00
mnwexxx
d6d3d61bdd 升级fastjson版本到1.2.83,1.2.83版本之前存在代码执行漏洞风险,CVE-2022-25845
升级fastjson版本到1.2.83,1.2.83版本之前存在代码执行漏洞风险,CVE-2022-25845

Signed-off-by: mnwexxx <12525570+mnwexxx@user.noreply.gitee.com>
2023-03-26 10:04:15 +00:00
暮光:城中城
12599ff4db 更新文档地址
Signed-off-by: 暮光:城中城 <806783409@qq.com>
2023-03-22 14:25:26 +00:00
暮光:城中城
2f0b06a541 更新群信息
Signed-off-by: 暮光:城中城 <806783409@qq.com>
2023-03-18 10:05:11 +00:00
暮光:城中城
e257cec3b6 简化数据库名称 2023-03-12 16:16:37 +08:00
暮光:城中城
300c0b75fe 包含升级SQL 2023-03-12 15:47:39 +08:00
暮光:城中城
e495588dae 数据备份脚本同步 2023-03-12 15:37:33 +08:00
暮光:城中城
269b55d870 V1.1.4 RELEASE 2023-03-12 15:19:50 +08:00
diantu
27c06ce748 代码补全 2023-03-11 10:59:40 +08:00
diantu
79c73438da 定时任务工具类暂时注释 2023-03-09 18:17:11 +08:00
diantu
353bc4ae97 数据库备份基础框架构建 2023-03-08 18:19:38 +08:00
暮光:城中城
4b0ec31e6f 修改版本号 2023-03-07 22:42:34 +08:00
暮光:城中城
8f48484725 移除未完善的LDAP,数据源支持MySQL8 2023-03-07 17:47:25 +08:00
暮光:城中城
6d744d6304 新增需求 2023-03-06 22:00:47 +08:00
暮光:城中城
2ac461d3e1 增加示例 2023-03-06 21:14:53 +08:00
暮光:城中城
fcc8b9e47b 需求文档 2023-03-06 21:12:39 +08:00
暮光:城中城
be668d9441 build 2023-03-02 23:55:16 +08:00
暮光:城中城
674de356e7 优化文档展示细节,优化开放文档样式 2023-03-02 23:34:59 +08:00
暮光:城中城
a819a8df59 #I6IWI9 解决没有升级脚本时提示没有找到文件问题 2023-03-02 23:20:18 +08:00
暮光:城中城
76307b05b3 #I6IUWC 解决vue变量赋值问题 2023-03-02 23:04:50 +08:00
暮光:城中城
07d86c8ae0 hamburger image
Signed-off-by: 暮光:城中城 <806783409@qq.com>
2023-03-01 07:05:49 +00:00
暮光:城中城
accfbf81f1 新建 images 2023-03-01 07:04:59 +00:00
diantu
ddaf23158d 获取数据源连接配置优化
druid版本升级到1.2.16
已知问题修复
2023-03-01 12:02:38 +08:00
diantu
32259be29f sql执行器页面优化
已知问题修复
2023-02-24 18:12:04 +08:00
diantu
fdd9683a7f sql执行器数据量过大自动开启分页
已发现bug修复
2023-02-22 19:16:31 +08:00
暮光:城中城
d8ea5c34ec 修改初始化脚本id冲突的问题 2023-02-21 22:54:55 +08:00
暮光:城中城
17c0531c6b V1.1.3 release 2023-02-18 22:18:18 +08:00
暮光:城中城
f8118067e5 处理上传图片变成附件了的问题 2023-02-16 22:41:11 +08:00
暮光:城中城
e5b7e68cb0 build 2023-02-16 22:18:49 +08:00
暮光:城中城
1da583ad3d #I6FMPT 解决富文本编辑器图片上传失败问题 2023-02-16 22:17:26 +08:00
暮光:城中城
65277168bb #I6FO83 解决多次查看页面,编辑时是上一次的页面问题 2023-02-16 21:56:17 +08:00
diantu
bcf675943c sql执行器解析增加数据库类型判断 2023-02-16 15:35:17 +08:00
暮光:城中城
b2d5a86da6 build 2023-02-15 20:40:19 +08:00
暮光:城中城
852727b3ad 修改SQL执行逻辑,解决一个sql中字段名重复取值混乱问题,优化SQL编辑器 2023-02-15 20:35:34 +08:00
diantu
6aec6ce8d6 补充提交 2023-02-14 16:37:55 +08:00
diantu
41a3760b2a 修复数据库导出时多次response导致的控制台报错问题
达梦关键词过滤
数据库导出CLOB数据类型处理
2023-02-13 21:10:58 +08:00
暮光:城中城
f8efca5ee0 初始化用户时增加数据源管理权,给用户授权后改为无需重新登录即可拥有新的权限 2023-02-13 20:27:53 +08:00
diantu
1ae0e92c10 sql执行器与表数据页面优化 2023-02-09 22:27:39 +08:00
diantu
9d54140617 表数据筛选使用性优化,新增动态提示
新增数据库备份工具类
2023-02-08 18:21:09 +08:00
diantu
c04e322f7c 达梦,oracle获取表信息sql完善修复 2023-02-07 17:45:41 +08:00
diantu
679eca9196 引入虚拟表格组件,极大改善大数据量情况下的表格性能 2023-02-07 15:35:34 +08:00
暮光:城中城
06cac2b034 #I6D0A2 修改代码块渲染问题 2023-02-06 20:44:34 +08:00
diantu
704d6c73b4 修复:达梦数据库查询数据时,关键词导致的报错 2023-02-06 17:26:30 +08:00
diantu
9b7804511e 修复:新增数据源时,参数填写错误,druid连接池配置未能正确关闭,导致控制台重复输出错误日志的问题 2023-02-06 16:11:06 +08:00
diantu
e4313007fb mysql->sqlserver建表语句转换 2023-02-06 11:41:38 +08:00
暮光:城中城
67341e3e92 update README.md.
Signed-off-by: 暮光:城中城 <806783409@qq.com>
2023-02-04 10:07:23 +00:00
暮光:城中城
a7eaa4dd4b update README.md.
Signed-off-by: 暮光:城中城 <806783409@qq.com>
2023-02-04 10:05:18 +00:00
323 changed files with 29788 additions and 24682 deletions

7
.gitignore vendored
View File

@@ -61,3 +61,10 @@ rebel.xml
# 忽略office文件打开临时文件 #
[~$]*.*
tmlog.lck
/.metadata/
zyplayer-doc-data/bin
zyplayer-doc-api/bin
zyplayer-doc-core/bin
zyplayer-doc-data/src/main/java/com/zyplayer/.metadata/
zyplayer-doc-db/bin/
zyplayer-doc-wiki/bin/

View File

@@ -1,42 +1,84 @@
# 项目介绍
zyplayer-doc是一款适合团队和个人使用的WIKI文档管理工具同时还包含数据库文档、Api接口文档。
<p align="center">
<img src="https://gitee.com/dromara/zyplayer-doc/raw/master/zyplayer-doc-other/resource/logo.png">
</p>
体验地址:[http://doc.zyplayer.com](http://doc.zyplayer.com/) 账号zyplayer 密码123456
<h1 align="center">zyplayer-doc</h1>
各模块的详细使用文档地址,可参考:
[详细部署文档](http://doc.zyplayer.com/doc-wiki#/docs/w4eSzPWvQRSBvaCHZS8t6d)
<p align="center">专注于私有化部署的在线知识库管理平台</p>
欢迎有想法的一起来完善如果觉得不错就给个Star鼓励下呗作为给作者快速更新的动力
# 项目简介
zyplayer-doc是一款适合团队和个人私有化部署使用的WIKI文档管理工具同时还包含数据库管理、Api接口管理等模块。
欢迎加群讨论QQ群号466363173
适合作为公司内部或个人的知识库、笔记、文档管理工具,将文档发布成对外可访问的形式,可作为公司的产品文档、帮助文档等。
体验地址:[http://zyplayer.com](http://zyplayer.com)
在线文档:[http://doc.zyplayer.com](http://doc.zyplayer.com)
欢迎有想法的同学一起来完善如果觉得不错就给个Star鼓励下呗作为给项目快速更新的动力
欢迎加入微信群与我们一起交流
> 微信群员超过限制只能加好友拉进群,添加微信好友,回复:`加群` 即可
![weixinqun.jpg](https://gitee.com/dromara/zyplayer-doc/raw/master/zyplayer-doc-other/resource/weixinqun.png)
# 快速启动
## 数据库依赖
你得有一个MySQL数据库建议版本号为5.7.25建库zyplayer_doc_manage
## 相关依赖
启动本系统仅依赖JAVA和MySQL
- JAVA 1.8+
- MySQL 5.7.x、8.x
## main方法启动
1. 修改 zyplayer-doc/zyplayer-doc-manage/src/main/resources/application.yml 配置文件里面的数据库账号密码
2. 执行 com.zyplayer.doc.manage.Application.main 方法启动项目启动后访问http://127.0.0.1:8083/zyplayer-doc/
数据库安装成功后,需要您**手动创建**一个库:`zyplayer_doc`
## jar方式启动
1. 直接下载直接下载编译好的jar打包文件加入QQ群即可下载编译好的最新版QQ群号466363173
2. 自行编译也可以自己动手编译双击执行zyplayer-doc\build.bat将使用maven编译整个项目为可执行的jar文件编译结果文件放在zyplayer-doc\dist\version 文件夹下如果电脑没有安装maven则需要先安装
3. 修改第一步或第二步结果文件夹下的 application.yml 文件里面数据库帐号密码
4. 双击第一步或第二步结果文件夹下的 startup.bat 启动项目启动后访问http://127.0.0.1:8083/zyplayer-doc/
```sql
-- 建库语句
create database zyplayer_doc;
```
> 建表SQL脚本无需手动执行每次启动或更新之后都会检查当前版本然后自动执行升级SQL脚本所以每次有版本更新需求只需要下载最新版本启动即可无需其他特殊操作
## 宝塔面板一键部署
- 安装宝塔面板,前往[宝塔面板](https://www.bt.cn/u/2OCdV3)官网,选择对应的脚本下载安装,宝塔版本:`9.2.0+`
- 登录宝塔面板,在菜单栏中点击 Docker根据提示安装 Docker 和 Docker Compose 服务,若已有则跳过
- 在Docker-应用商店查询到 zyplayer-doc点击安装
- 设置域名等基本信息,点击确定
- 提交后面板会自动进行应用初始化大概需要1-5分钟初始化完成后即可访问。
![输入图片说明](zyplayer-doc-other/resource/image.png)
## Main方法启动
1. 修改`zyplayer-doc-manage/src/main/resources/application.yml`配置文件里面的数据库账号密码
2. 执行`com.zyplayer.doc.manage.Application.main`方法启动项目
## JAR方式启动
1. 直接下载直接下载编译好的jar打包文件编译后的最新版可到 [发行版下载处](https://gitee.com/dromara/zyplayer-doc/releases) 去下载
2. 自行编译:也可以自己动手编译,双击执行:`zyplayer-doc\build.bat`将使用maven编译整个项目为可执行的jar文件编译结果文件放在`zyplayer-doc\dist\version`文件夹下
3. 修改第一步或第二步结果文件夹下的`application.yml`文件里面数据库帐号密码
4. 双击第一步或第二步结果文件夹下的`startup.bat`启动项目
## Tomcat容器启动
1. 直接下载编译好的war打包文件加入QQ群即可下载编译的最新版QQ群号466363173
2. 修改配置文件zyplayer-doc.zip\apache-tomcat\webapps\zyplayer-doc\WEB-INF\classes\application.yml 配置文件里面的数据库账号密码
3. 双击tomcat\bin\startup.bat启动即可
1. 直接下载编译好的war打包文件编译的最新版可到 [发行版下载处](https://gitee.com/dromara/zyplayer-doc/releases) 去下载
2. 修改配置文件:`zyplayer-doc.zip\apache-tomcat\webapps\zyplayer-doc\WEB-INF\classes\application.yml`配置文件里面的数据库账号密码
3. 双击`tomcat\bin\startup.bat`启动即可
默认登录账号zyplayer 密码123456
## 其他
更多启动方式请参考文档:[项目下载与部署](http://doc.zyplayer.com/#/integrate/zyplayer-doc/opensource/279)
启动后访问:[http://127.0.0.1:8083](http://127.0.0.1:8083) ,默认登录账号: **zyplayer** 密码: **123456**
# 各模块介绍
## zyplayer-doc-manage 文档管理后台
1. 具有项目模块导航,人员及权限管理功能,分组管理等功能。
2. 集成了本项目内的各个子模块功能,是各模块的协调管理模块。
## zyplayer-doc-db 数据库文档
## zyplayer-doc-wiki wiki文档工具
1. 在线管理公司、项目及任意形式的文档
2. 文档支持按空间划分,按人员分组授权,支持空间收藏和空间内的文档开放访问。
3. 文档支持编辑、查看、评论、上传附件、历史版本查看、页面权限控制、文档搜索等功能。
4. 文档编辑支持html富文本方式编辑和markdown的方式编辑。
5. 本工具使用的开源工具有vue、element-ui、mavon-editor、wangeditor等。
6. 参考学习了Atlassian Confluence文档工具进行开发争取作为该软件的开源免费替代产品同时作为内部文档管理工具最好的存在。
## zyplayer-doc-db 数据库工具
一款在线管理数据库的工具,你可以将所有的数据源统一管理到这里面,团队间的各成员就不必每人在自己电脑上装一个数据库管理软件,
然后再添加数据源,可以统一修改数据库账号密码而不用群广播通知,新员工进入后对他使用到的数据源进行授权即可使用。
@@ -47,14 +89,6 @@ zyplayer-doc是一款适合团队和个人使用的WIKI文档管理工具
5. 支持库函数和存储过程的增删改查,修改记录查询等。
6. 目标是取代Navicat做一个小而精的开源免费的在线数据库管理工具。
## zyplayer-doc-wiki wiki文档工具
1. 在线管理公司、项目及任意形式的文档
2. 文档支持按空间划分,按人员分组授权,支持空间收藏和空间内的文档开放访问。
3. 文档支持编辑、查看、评论、上传附件、历史版本查看、页面权限控制、文档搜索等功能。
4. 文档编辑支持html富文本方式编辑和markdown的方式编辑。
5. 本工具使用的开源工具有vue、element-ui、mavon-editor、wangeditor等。
6. 参考学习了Atlassian Confluence文档工具进行开发争取作为该软件的开源免费替代产品同时作为内部文档管理工具最好的存在。
## zyplayer-doc-api API接口文档管理工具
一款支持统一管理Swagger文档、OpenApi文档、自建接口文档的管理工具具有文档查看、接口请求、全局参数管理等功能设计走心前端代码使用最新技术构建每一行代码都是全新手动敲出来的超级简单明了代码简洁美观可读性好、易维护。
@@ -69,10 +103,10 @@ zyplayer-doc是一款适合团队和个人使用的WIKI文档管理工具
5. zyplayer-doc-other 一些测试
# 用爱发电
如果您正在使用这个项目并感觉良好,或者是想支持继续开发,您可以通过如下`任意`方式支持我:
如果您正在使用这个项目并感觉良好,或者是想支持项目继续开发,您可以通过如下`任意`方式支持我
1. Star并分享 [zyplayer-doc](https://gitee.com/zyplayer/zyplayer-doc)
2. 保留`关于页面`的项目链接
3. 通过[一次性捐赠](http://doc.zyplayer.com/doc-wiki#/docs/w4eSzPWvQRSBvaCHZS8t6d/359) 支持,我会去买一杯咖啡或攒着去植发
3. 你也可以选择使用 [商业版](https://doc.zyplayer.com/#/integrate/zyplayer-doc/commercial) 支持我们
# 界面展示
控制台页面

View File

@@ -4,7 +4,7 @@ set dist_dir=dist
set app_name=zyplayer-doc
set version="1.1.2"
set version="1.1.5"
set build_folder=%app_name%-%version%
@@ -20,6 +20,7 @@ md %target_dir%
copy zyplayer-doc-manage\target\zyplayer-doc.jar %target_dir%
copy zyplayer-doc-manage\src\main\resources\application.yml %target_dir%
copy zyplayer-doc-manage\src\main\resources\application_pg.yml %target_dir%
xcopy /e /y /q zyplayer-doc-other\script %target_dir%

View File

@@ -4,7 +4,7 @@ dist_dir="dist"
app_name="zyplayer-doc"
version="1.1.2"
version="1.1.5"
build_folder="${app_name}-${version}"

56
pom.xml
View File

@@ -4,7 +4,7 @@
<groupId>com.zyplayer</groupId>
<artifactId>zyplayer-doc</artifactId>
<version>1.1.2</version>
<version>1.0.0</version>
<packaging>pom</packaging>
<name>zyplayer-doc</name>
@@ -18,7 +18,7 @@
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<fastjson.version>1.2.53</fastjson.version>
<zyplayer.doc.version>1.1.2</zyplayer.doc.version>
<zyplayer.doc.version>1.0.0</zyplayer.doc.version>
<spring.boot.version>2.1.6.RELEASE</spring.boot.version>
</properties>
@@ -59,15 +59,10 @@
<artifactId>spring-boot-starter-jdbc</artifactId>
<version>${spring.boot.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-ldap</artifactId>
<version>${spring.boot.version}</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
<version>8.0.32</version>
</dependency>
<dependency>
<groupId>net.sourceforge.jtds</groupId>
@@ -78,13 +73,13 @@
<dependency>
<groupId>com.dameng</groupId>
<artifactId>DmJdbcDriver18</artifactId>
<version>8.1.1.193</version>
</dependency>
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc6</artifactId>
<version>12.1.0.1-atlassian-hosted</version>
<version>8.1.2.192</version>
</dependency>
<!-- <dependency>-->
<!-- <groupId>com.oracle</groupId>-->
<!-- <artifactId>ojdbc6</artifactId>-->
<!-- <version>12.1.0.1-atlassian-hosted</version>-->
<!-- </dependency>-->
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
@@ -115,11 +110,6 @@
<artifactId>commons-lang3</artifactId>
<version>3.12.0</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.7</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
@@ -128,7 +118,12 @@
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.3.2</version>
<version>3.5.3.1</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-core</artifactId>
<version>3.5.3.1</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
@@ -138,13 +133,19 @@
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.14</version>
<version>1.2.16</version>
</dependency>
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.28</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.24</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
@@ -158,7 +159,7 @@
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.78</version>
<version>1.2.83</version>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
@@ -166,14 +167,9 @@
<version>5.6.6</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-core</artifactId>
<version>3.4.3.2</version>
</dependency>
<dependency>
<groupId>com.zyplayer</groupId>
<artifactId>zyplayer-doc-annotation</artifactId>
<version>${zyplayer.doc.version}</version>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.17.2</version>
</dependency>
<dependency>
<groupId>com.zyplayer</groupId>

View File

@@ -1,22 +1,14 @@
# 本文件用于已部署好的系统检测自己是否需要升级使用,怕有人担心安全一类的问题,所以不提供服务器接口来做
lastVersion=1.1.2
lastVersion=1.1.6
upgradeContent=1. #I636K1 全局搜索优化;\
2. 同步闭源版本部分代码,修复页面顺序问题;\
3. 添加注释和使用lombok @Mdai\
4. 修复初始化显示文档菜单显示高亮问题,修复重复点击报错问题 @〝走走停停\
5. 使用 @RequiredArgsConstructor 进行注入 @handy\
6. md预览过滤格式tree图标打包版本指定 @护身法\
7. mysql->oracle建表语句转换 @diantu\
8. sqlserver->mysql建表语句转换 @diantu\
9. 自动执行升级SQL、历史记录改为数据库存储、去掉git操作优化代码结构去掉不需要的文件\
10. 将wiki升级为vue3版本\
11. #I69PMN 修复模态框点击关闭问题;\
12. WIKI空间支持分页页面展示优化\
13. #I69ZVX 修改不能保存表情问题,优化脚本;\
14. 修复mysql数据库使用前置sql语句时,因数据库名包含特殊字符导致的报错问题 @diantu\
15. 修复oracle使用use语句导致的报错问题 @diantu\
16. 新增达梦数据库支持 @diantu\
upgradeContent=1. 优化WIKI文档展示\
2. #I6S5YA 解决路由错误问题;\
3. #I6Z8UX 解决表格样式问题\
4. #I6Z8UX 解决列表样式问题,修复保存后文档加载问题\
5. 升级fastjson版本\
6. 修复图片查看问题\
7. 移除错误的和不需要的依赖\
8. 修复保存后文档加载问题;
upgradeUrl=https://gitee.com/zyplayer/zyplayer-doc/releases
nextStep=

View File

@@ -24,7 +24,7 @@
<parent>
<groupId>com.zyplayer</groupId>
<artifactId>zyplayer-doc</artifactId>
<version>1.1.2</version>
<version>1.0.0</version>
</parent>
<properties>
@@ -59,8 +59,6 @@
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>RELEASE</version>
<scope>compile</scope>
</dependency>
</dependencies>

View File

@@ -36,7 +36,7 @@ import java.util.stream.Collectors;
@RestController
@RequestMapping("/doc-api/doc/auth")
public class ApiDocAuthController {
private static Logger logger = LoggerFactory.getLogger(ApiDocAuthController.class);
private static final Logger logger = LoggerFactory.getLogger(ApiDocAuthController.class);
@Resource
UserAuthService userAuthService;
@@ -93,7 +93,7 @@ public class ApiDocAuthController {
if (CollectionUtils.isNotEmpty(userModuleAuthList)) {
UserAuth userAuth = userModuleAuthList.remove(0);
// 错误数据兼容移除
if (userModuleAuthList.size() > 0) {
if (!userModuleAuthList.isEmpty()) {
List<Long> authIdList = userModuleAuthList.stream().map(UserAuth::getId).collect(Collectors.toList());
userAuthService.removeByIds(authIdList);
}

View File

@@ -43,7 +43,7 @@ import java.util.Objects;
@RestController
@RequestMapping("/doc-api/doc")
public class ApiDocumentController {
private static Logger logger = LoggerFactory.getLogger(ApiDocumentController.class);
private static final Logger logger = LoggerFactory.getLogger(ApiDocumentController.class);
@Resource
ApiDocAuthJudgeService apiDocAuthJudgeService;

View File

@@ -34,7 +34,7 @@ import java.util.Optional;
@RestController
@RequestMapping("/doc-api/global-param")
public class ApiGlobalParamController {
private static Logger logger = LoggerFactory.getLogger(ApiGlobalParamController.class);
private static final Logger logger = LoggerFactory.getLogger(ApiGlobalParamController.class);
@Resource
private ApiGlobalParamService apiGlobalParamService;

View File

@@ -30,7 +30,7 @@ import javax.servlet.http.HttpServletResponse;
@RestController
@RequestMapping("/doc-api/proxy")
public class ApiPoxyRequestController {
private static Logger logger = LoggerFactory.getLogger(ApiPoxyRequestController.class);
private static final Logger logger = LoggerFactory.getLogger(ApiPoxyRequestController.class);
@Resource
ApiCustomNodeService apiCustomNodeService;

View File

@@ -30,7 +30,7 @@ import java.util.List;
@RestController
@RequestMapping("/doc-api/request-param")
public class ApiRequestParamController {
private static Logger logger = LoggerFactory.getLogger(ApiRequestParamController.class);
private static final Logger logger = LoggerFactory.getLogger(ApiRequestParamController.class);
@Resource
private ApiRequestParamService apiRequestParamService;

View File

@@ -27,7 +27,7 @@ import java.util.Objects;
@RestController
@RequestMapping("/doc-api/share")
public class ApiShareDocumentController {
private static Logger logger = LoggerFactory.getLogger(ApiShareDocumentController.class);
private static final Logger logger = LoggerFactory.getLogger(ApiShareDocumentController.class);
@Resource
private ApiDocService swaggerDocService;

View File

@@ -42,15 +42,15 @@ import java.util.stream.Stream;
*/
@Service
public class SwaggerHttpRequestService {
private static Logger logger = LoggerFactory.getLogger(SwaggerHttpRequestService.class);
private static final Logger logger = LoggerFactory.getLogger(SwaggerHttpRequestService.class);
@Resource
private ApiGlobalParamService apiGlobalParamService;
private static final Map<String, Method> requestMethodMap = Stream.of(Method.values()).collect(Collectors.toMap(val -> val.name().toLowerCase(), val -> val));
List<String> domainHeaderKeys = Arrays.asList("referer", "origin");
List<String> needRequestHeaderKeys = Arrays.asList("user-agent");
final List<String> domainHeaderKeys = Arrays.asList("referer", "origin");
final List<String> needRequestHeaderKeys = Collections.singletonList("user-agent");
/**
* 请求真实的swagger文档内容
@@ -72,13 +72,12 @@ public class SwaggerHttpRequestService {
requestHeaders.put("host", SwaggerDocUtil.getDomainHost(docDomain));
}
// 执行请求
String resultStr = HttpRequest.get(docUrl)
return HttpRequest.get(docUrl)
.form(globalFormParamMap)
.addHeaders(requestHeaders)
.header("Accept", "application/json, text/javascript, */*; q=0.01")
.cookie(this.getHttpCookie(request, globalCookieParamMap, null))
.timeout(10000).execute().body();
return resultStr;
}
/**
@@ -176,7 +175,7 @@ public class SwaggerHttpRequestService {
multiResource.add(new BytesResource(file.getBytes(), file.getOriginalFilename()));
}
httpRequest.form(originKey, multiResource);
} else if (fileList.size() > 0) {
} else if (!fileList.isEmpty()) {
MultipartFile multipartFile = fileList.get(0);
httpRequest.form(originKey, multipartFile.getBytes(), multipartFile.getOriginalFilename());
}

View File

@@ -0,0 +1 @@
import{u as S,a9 as w,r as c,o as a,c as l,w as t,a as o,k as g,t as n,b as i,F as f,s,e as m,d as M}from"./vendor.6399378c.js";import{m as B}from"./index.086d0536.js";import{_ as C}from"./main.5fd30069.js";const N={setup(){const _=S(),D=w(()=>_.state.swaggerDoc),u=w(()=>_.state.swaggerDoc.info),e=w(()=>_.state.swaggerMethodStatistic);return{swaggerDoc:D,swaggerDocInfo:u,swaggerMethodStatistic:e,getDescription:I=>B.exports.markdownIt.render(I||"")}}},V=["href"],j=["href"],L=["href"],O=["innerHTML"],T={key:1,style:{"text-align":"center"}};function E(_,D,u,e,p,I){const r=c("a-form-item"),h=c("a-divider"),v=c("a-statistic"),k=c("a-card"),b=c("a-col"),y=c("a-row"),x=c("a-form");return a(),l(k,null,{default:t(()=>[e.swaggerDocInfo?(a(),l(x,{key:0,"label-col":{span:4},"wrapper-col":{span:20}},{default:t(()=>[o(r,{label:"\u6807\u9898"},{default:t(()=>[g(n(e.swaggerDocInfo.title),1)]),_:1}),o(r,{label:"\u7248\u672C"},{default:t(()=>[g(n(e.swaggerDocInfo.version),1)]),_:1}),e.swaggerDocInfo.contact?(a(),l(r,{key:0,label:"\u4F5C\u8005"},{default:t(()=>[e.swaggerDocInfo.contact.name?(a(),i(f,{key:0},[g(n(e.swaggerDocInfo.contact.name),1)],64)):s("",!0),e.swaggerDocInfo.contact.email?(a(),i(f,{key:1},[o(h,{type:"vertical"}),g(n(e.swaggerDocInfo.contact.email),1)],64)):s("",!0),e.swaggerDocInfo.contact.url?(a(),i(f,{key:2},[o(h,{type:"vertical"}),m("a",{href:e.swaggerDocInfo.contact.url,target:"_blank"},n(e.swaggerDocInfo.contact.url),9,V)],64)):s("",!0)]),_:1})):s("",!0),o(r,{label:"host"},{default:t(()=>[g(n(e.swaggerDoc.host),1)]),_:1}),e.swaggerDocInfo.license?(a(),l(r,{key:1,label:"\u8BB8\u53EF\u8BC1"},{default:t(()=>[m("a",{href:e.swaggerDocInfo.license.url,target:"_blank"},n(e.swaggerDocInfo.license.name),9,j)]),_:1})):s("",!0),e.swaggerDocInfo.termsOfService?(a(),l(r,{key:2,label:"\u670D\u52A1\u6761\u6B3E"},{default:t(()=>[m("a",{href:e.swaggerDocInfo.termsOfService,target:"_blank"},n(e.swaggerDocInfo.termsOfService),9,L)]),_:1})):s("",!0),o(r,{label:"\u6587\u6863\u8BF4\u660E"},{default:t(()=>[m("div",{class:"markdown-body",innerHTML:e.getDescription(e.swaggerDocInfo.description)},null,8,O)]),_:1}),o(r,{label:"\u63A5\u53E3\u7EDF\u8BA1"},{default:t(()=>[o(y,{gutter:[16,16]},{default:t(()=>[(a(),i(f,null,M(["get","post","put","delete","head","patch","options","trace","total"],d=>(a(),i(f,null,[e.swaggerMethodStatistic[d]?(a(),l(b,{key:0,span:6},{default:t(()=>[o(k,{size:"small"},{default:t(()=>[o(v,{title:d==="total"?"\u603B\u8BA1":d.toUpperCase()+"\u65B9\u6CD5",value:e.swaggerMethodStatistic[d],suffix:"\u4E2A"},null,8,["title","value"])]),_:2},1024)]),_:2},1024)):s("",!0)],64))),64))]),_:1})]),_:1})]),_:1})):(a(),i("div",T,"\u6682\u65E0\u6587\u6863\u4FE1\u606F\uFF0C\u8BF7\u5148\u9009\u62E9\u6587\u6863"))]),_:1})}var U=C(N,[["render",E]]);export{U as default};

View File

@@ -1 +0,0 @@
import{u as S,a9 as w,r as c,o as a,c as l,w as t,a as o,m as g,t as n,b as i,F as f,k as s,e as m,d as M}from"./vendor.627eef95.js";import{m as B}from"./index.a17fca00.js";import{_ as C}from"./main.2b6ab185.js";const N={setup(){const _=S(),D=w(()=>_.state.swaggerDoc),u=w(()=>_.state.swaggerDoc.info),e=w(()=>_.state.swaggerMethodStatistic);return{swaggerDoc:D,swaggerDocInfo:u,swaggerMethodStatistic:e,getDescription:I=>B.exports.markdownIt.render(I||"")}}},V=["href"],j=["href"],L=["href"],O=["innerHTML"],T={key:1,style:{"text-align":"center"}};function E(_,D,u,e,p,I){const r=c("a-form-item"),h=c("a-divider"),b=c("a-statistic"),k=c("a-card"),v=c("a-col"),y=c("a-row"),x=c("a-form");return a(),l(k,null,{default:t(()=>[e.swaggerDocInfo?(a(),l(x,{key:0,"label-col":{span:4},"wrapper-col":{span:20}},{default:t(()=>[o(r,{label:"\u6807\u9898"},{default:t(()=>[g(n(e.swaggerDocInfo.title),1)]),_:1}),o(r,{label:"\u7248\u672C"},{default:t(()=>[g(n(e.swaggerDocInfo.version),1)]),_:1}),e.swaggerDocInfo.contact?(a(),l(r,{key:0,label:"\u4F5C\u8005"},{default:t(()=>[e.swaggerDocInfo.contact.name?(a(),i(f,{key:0},[g(n(e.swaggerDocInfo.contact.name),1)],64)):s("",!0),e.swaggerDocInfo.contact.email?(a(),i(f,{key:1},[o(h,{type:"vertical"}),g(n(e.swaggerDocInfo.contact.email),1)],64)):s("",!0),e.swaggerDocInfo.contact.url?(a(),i(f,{key:2},[o(h,{type:"vertical"}),m("a",{href:e.swaggerDocInfo.contact.url,target:"_blank"},n(e.swaggerDocInfo.contact.url),9,V)],64)):s("",!0)]),_:1})):s("",!0),o(r,{label:"host"},{default:t(()=>[g(n(e.swaggerDoc.host),1)]),_:1}),e.swaggerDocInfo.license?(a(),l(r,{key:1,label:"\u8BB8\u53EF\u8BC1"},{default:t(()=>[m("a",{href:e.swaggerDocInfo.license.url,target:"_blank"},n(e.swaggerDocInfo.license.name),9,j)]),_:1})):s("",!0),e.swaggerDocInfo.termsOfService?(a(),l(r,{key:2,label:"\u670D\u52A1\u6761\u6B3E"},{default:t(()=>[m("a",{href:e.swaggerDocInfo.termsOfService,target:"_blank"},n(e.swaggerDocInfo.termsOfService),9,L)]),_:1})):s("",!0),o(r,{label:"\u6587\u6863\u8BF4\u660E"},{default:t(()=>[m("div",{class:"markdown-body",innerHTML:e.getDescription(e.swaggerDocInfo.description)},null,8,O)]),_:1}),o(r,{label:"\u63A5\u53E3\u7EDF\u8BA1"},{default:t(()=>[o(y,{gutter:[16,16]},{default:t(()=>[(a(),i(f,null,M(["get","post","put","delete","head","patch","options","trace","total"],d=>(a(),i(f,null,[e.swaggerMethodStatistic[d]?(a(),l(v,{key:0,span:6},{default:t(()=>[o(k,{size:"small"},{default:t(()=>[o(b,{title:d==="total"?"\u603B\u8BA1":d.toUpperCase()+"\u65B9\u6CD5",value:e.swaggerMethodStatistic[d],suffix:"\u4E2A"},null,8,["title","value"])]),_:2},1024)]),_:2},1024)):s("",!0)],64))),64))]),_:1})]),_:1})]),_:1})):(a(),i("div",T,"\u6682\u65E0\u6587\u6863\u4FE1\u606F\uFF0C\u8BF7\u5148\u9009\u62E9\u6587\u6863"))]),_:1})}var U=C(N,[["render",E]]);export{U as default};

View File

@@ -1 +1 @@
import{u as S,a9 as D,r as i,o as t,c as l,w as o,a as n,m as s,t as c,b as p,F as f,k as r,e as m,d as w}from"./vendor.627eef95.js";import{m as M}from"./index.a17fca00.js";import{_ as B}from"./main.2b6ab185.js";const C={setup(){const _=S(),A=D(()=>_.state.openApiDoc),u=D(()=>_.state.openApiDoc.info),e=D(()=>_.state.openApiMethodStatistic);return{openApiDoc:A,openApiDocInfo:u,openApiMethodStatistic:e,getDescription:I=>M.exports.markdownIt.render(I||"")}}},N=["href"],V=["href"],j=["href"],L=["innerHTML"],O={key:1,style:{"text-align":"center"}};function T(_,A,u,e,b,I){const a=i("a-form-item"),h=i("a-divider"),v=i("a-statistic"),k=i("a-card"),y=i("a-col"),g=i("a-row"),x=i("a-form");return t(),l(k,null,{default:o(()=>[e.openApiDocInfo?(t(),l(x,{key:0,"label-col":{span:4},"wrapper-col":{span:20}},{default:o(()=>[n(a,{label:"\u6807\u9898"},{default:o(()=>[s(c(e.openApiDocInfo.title),1)]),_:1}),n(a,{label:"\u7248\u672C"},{default:o(()=>[s(c(e.openApiDocInfo.version),1)]),_:1}),e.openApiDocInfo.contact?(t(),l(a,{key:0,label:"\u4F5C\u8005"},{default:o(()=>[e.openApiDocInfo.contact.name?(t(),p(f,{key:0},[s(c(e.openApiDocInfo.contact.name),1)],64)):r("",!0),e.openApiDocInfo.contact.email?(t(),p(f,{key:1},[n(h,{type:"vertical"}),s(c(e.openApiDocInfo.contact.email),1)],64)):r("",!0),e.openApiDocInfo.contact.url?(t(),p(f,{key:2},[n(h,{type:"vertical"}),m("a",{href:e.openApiDocInfo.contact.url,target:"_blank"},c(e.openApiDocInfo.contact.url),9,N)],64)):r("",!0)]),_:1})):r("",!0),n(a,{label:"host"},{default:o(()=>[s(c(e.openApiDoc.host),1)]),_:1}),e.openApiDocInfo.license?(t(),l(a,{key:1,label:"\u8BB8\u53EF\u8BC1"},{default:o(()=>[m("a",{href:e.openApiDocInfo.license.url,target:"_blank"},c(e.openApiDocInfo.license.name),9,V)]),_:1})):r("",!0),e.openApiDocInfo.termsOfService?(t(),l(a,{key:2,label:"\u670D\u52A1\u6761\u6B3E"},{default:o(()=>[m("a",{href:e.openApiDocInfo.termsOfService,target:"_blank"},c(e.openApiDocInfo.termsOfService),9,j)]),_:1})):r("",!0),n(a,{label:"\u6587\u6863\u8BF4\u660E"},{default:o(()=>[m("div",{class:"markdown-body",innerHTML:e.getDescription(e.openApiDocInfo.description)},null,8,L)]),_:1}),n(a,{label:"\u63A5\u53E3\u7EDF\u8BA1"},{default:o(()=>[n(g,{gutter:[16,16]},{default:o(()=>[(t(),p(f,null,w(["get","post","put","delete","head","patch","options","trace","total"],d=>(t(),p(f,null,[e.openApiMethodStatistic[d]?(t(),l(y,{key:0,span:6},{default:o(()=>[n(k,{size:"small"},{default:o(()=>[n(v,{title:d==="total"?"\u603B\u8BA1":d.toUpperCase()+"\u65B9\u6CD5",value:e.openApiMethodStatistic[d],suffix:"\u4E2A"},null,8,["title","value"])]),_:2},1024)]),_:2},1024)):r("",!0)],64))),64))]),_:1})]),_:1})]),_:1})):(t(),p("div",O,"\u6682\u65E0\u6587\u6863\u4FE1\u606F\uFF0C\u8BF7\u5148\u9009\u62E9\u6587\u6863"))]),_:1})}var z=B(C,[["render",T]]);export{z as default};
import{u as S,a9 as D,r as i,o as t,c as l,w as o,a as n,k as p,t as c,b as s,F as f,s as r,e as m,d as w}from"./vendor.6399378c.js";import{m as M}from"./index.086d0536.js";import{_ as B}from"./main.5fd30069.js";const C={setup(){const _=S(),A=D(()=>_.state.openApiDoc),u=D(()=>_.state.openApiDoc.info),e=D(()=>_.state.openApiMethodStatistic);return{openApiDoc:A,openApiDocInfo:u,openApiMethodStatistic:e,getDescription:I=>M.exports.markdownIt.render(I||"")}}},N=["href"],V=["href"],j=["href"],L=["innerHTML"],O={key:1,style:{"text-align":"center"}};function T(_,A,u,e,v,I){const a=i("a-form-item"),h=i("a-divider"),b=i("a-statistic"),k=i("a-card"),y=i("a-col"),g=i("a-row"),x=i("a-form");return t(),l(k,null,{default:o(()=>[e.openApiDocInfo?(t(),l(x,{key:0,"label-col":{span:4},"wrapper-col":{span:20}},{default:o(()=>[n(a,{label:"\u6807\u9898"},{default:o(()=>[p(c(e.openApiDocInfo.title),1)]),_:1}),n(a,{label:"\u7248\u672C"},{default:o(()=>[p(c(e.openApiDocInfo.version),1)]),_:1}),e.openApiDocInfo.contact?(t(),l(a,{key:0,label:"\u4F5C\u8005"},{default:o(()=>[e.openApiDocInfo.contact.name?(t(),s(f,{key:0},[p(c(e.openApiDocInfo.contact.name),1)],64)):r("",!0),e.openApiDocInfo.contact.email?(t(),s(f,{key:1},[n(h,{type:"vertical"}),p(c(e.openApiDocInfo.contact.email),1)],64)):r("",!0),e.openApiDocInfo.contact.url?(t(),s(f,{key:2},[n(h,{type:"vertical"}),m("a",{href:e.openApiDocInfo.contact.url,target:"_blank"},c(e.openApiDocInfo.contact.url),9,N)],64)):r("",!0)]),_:1})):r("",!0),n(a,{label:"host"},{default:o(()=>[p(c(e.openApiDoc.host),1)]),_:1}),e.openApiDocInfo.license?(t(),l(a,{key:1,label:"\u8BB8\u53EF\u8BC1"},{default:o(()=>[m("a",{href:e.openApiDocInfo.license.url,target:"_blank"},c(e.openApiDocInfo.license.name),9,V)]),_:1})):r("",!0),e.openApiDocInfo.termsOfService?(t(),l(a,{key:2,label:"\u670D\u52A1\u6761\u6B3E"},{default:o(()=>[m("a",{href:e.openApiDocInfo.termsOfService,target:"_blank"},c(e.openApiDocInfo.termsOfService),9,j)]),_:1})):r("",!0),n(a,{label:"\u6587\u6863\u8BF4\u660E"},{default:o(()=>[m("div",{class:"markdown-body",innerHTML:e.getDescription(e.openApiDocInfo.description)},null,8,L)]),_:1}),n(a,{label:"\u63A5\u53E3\u7EDF\u8BA1"},{default:o(()=>[n(g,{gutter:[16,16]},{default:o(()=>[(t(),s(f,null,w(["get","post","put","delete","head","patch","options","trace","total"],d=>(t(),s(f,null,[e.openApiMethodStatistic[d]?(t(),l(y,{key:0,span:6},{default:o(()=>[n(k,{size:"small"},{default:o(()=>[n(b,{title:d==="total"?"\u603B\u8BA1":d.toUpperCase()+"\u65B9\u6CD5",value:e.openApiMethodStatistic[d],suffix:"\u4E2A"},null,8,["title","value"])]),_:2},1024)]),_:2},1024)):r("",!0)],64))),64))]),_:1})]),_:1})]),_:1})):(t(),s("div",O,"\u6682\u65E0\u6587\u6863\u4FE1\u606F\uFF0C\u8BF7\u5148\u9009\u62E9\u6587\u6863"))]),_:1})}var z=B(C,[["render",T]]);export{z as default};

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -1 +1 @@
import{v as y,u as j,y as n,W as k,r as h,o as g,c as v,w,B as x,e as D}from"./vendor.627eef95.js";import{D as I,o as _}from"./DocContent.ebee379f.js";import{m as M}from"./index.a17fca00.js";import{_ as q}from"./main.2b6ab185.js";import"./logUtil.8ec1c7d7.js";const C={components:{DocContent:I},setup(){const a=y(),t=j();let p=n("doc"),o=n([]),r=n([]),c=n({url:"",description:"",method:"",consumes:"",produces:""}),s=n(!1),i=0,l;const m=()=>{let P=a.query.path+"."+a.query.method;if(Object.keys(t.state.openApiUrlMethodMap).length<=0){console.log("\u6587\u6863\u5C1A\u672A\u52A0\u8F7D\uFF0C\u7B49\u5F85\u52A0\u8F7D\u5B8C\u6210"),l||(l=setInterval(()=>{if(s.value||i++>50){clearInterval(l);return}Object.keys(t.state.openApiUrlMethodMap).length>0&&(console.log("\u6587\u6863\u5185\u5BB9\u6539\u53D8\uFF0C\u91CD\u65B0\u52A0\u8F7D\u6587\u6863"),m())},1e3));return}let e=t.state.openApiUrlMethodMap[P];if(!e){x.error("\u6CA1\u6709\u627E\u5230\u5BF9\u5E94\u7684\u6587\u6863");return}s.value=!0,t.commit("addTableName",{key:a.fullPath,val:e.summary});let u="",d="";e.consumes&&e.consumes.length>0&&(u=e.consumes.join(" ")),e.produces&&e.produces.length>0&&(d=e.produces.join(" "));let L=M.exports.markdownIt.render(e.description||e.summary||"");c.value={url:e.url,description:L,method:e.method||"",consumes:u,produces:d};let f=t.state.openApiComponents;o.value=_.getRequestParamList(e.parameters,f),r.value=_.getResponseParamList(e.responses,f)};return k(()=>{m()}),{docInfoShow:c,activePage:p,changePage:()=>{},isLoadSuccess:s,requestParamList:o,responseParamList:r}}},S=D("div",{style:{padding:"20px 0",height:"100px"}},null,-1);function b(a,t,p,o,r,c){const s=h("DocContent"),i=h("a-spin");return o.isLoadSuccess?(g(),v(s,{key:0,docInfoShow:o.docInfoShow,requestParamList:o.requestParamList,responseParamList:o.responseParamList},null,8,["docInfoShow","requestParamList","responseParamList"])):(g(),v(i,{key:1,tip:"\u6587\u6863\u6570\u636E\u52A0\u8F7D\u4E2D..."},{default:w(()=>[S]),_:1}))}var T=q(C,[["render",b]]);export{T as default};
import{v as y,u as j,y as n,W as k,r as h,o as g,c as v,w,B as x,e as D}from"./vendor.6399378c.js";import{D as I,o as _}from"./DocContent.6940f3d1.js";import{m as M}from"./index.086d0536.js";import{_ as q}from"./main.5fd30069.js";import"./logUtil.6309fa68.js";const C={components:{DocContent:I},setup(){const a=y(),t=j();let p=n("doc"),o=n([]),r=n([]),i=n({url:"",description:"",method:"",consumes:"",produces:""}),s=n(!1),c=0,l;const m=()=>{let P=a.query.path+"."+a.query.method;if(Object.keys(t.state.openApiUrlMethodMap).length<=0){console.log("\u6587\u6863\u5C1A\u672A\u52A0\u8F7D\uFF0C\u7B49\u5F85\u52A0\u8F7D\u5B8C\u6210"),l||(l=setInterval(()=>{if(s.value||c++>50){clearInterval(l);return}Object.keys(t.state.openApiUrlMethodMap).length>0&&(console.log("\u6587\u6863\u5185\u5BB9\u6539\u53D8\uFF0C\u91CD\u65B0\u52A0\u8F7D\u6587\u6863"),m())},1e3));return}let e=t.state.openApiUrlMethodMap[P];if(!e){x.error("\u6CA1\u6709\u627E\u5230\u5BF9\u5E94\u7684\u6587\u6863");return}s.value=!0,t.commit("addTableName",{key:a.fullPath,val:e.summary});let d="",u="";e.consumes&&e.consumes.length>0&&(d=e.consumes.join(" ")),e.produces&&e.produces.length>0&&(u=e.produces.join(" "));let L=M.exports.markdownIt.render(e.description||e.summary||"");i.value={url:e.url,description:L,method:e.method||"",consumes:d,produces:u};let f=t.state.openApiComponents;o.value=_.getRequestParamList(e.parameters,f),r.value=_.getResponseParamList(e.responses,f)};return k(()=>{m()}),{docInfoShow:i,activePage:p,changePage:()=>{},isLoadSuccess:s,requestParamList:o,responseParamList:r}}},S=D("div",{style:{padding:"20px 0",height:"100px"}},null,-1);function A(a,t,p,o,r,i){const s=h("DocContent"),c=h("a-spin");return o.isLoadSuccess?(g(),v(s,{key:0,docInfoShow:o.docInfoShow,requestParamList:o.requestParamList,responseParamList:o.responseParamList},null,8,["docInfoShow","requestParamList","responseParamList"])):(g(),v(c,{key:1,tip:"\u6587\u6863\u6570\u636E\u52A0\u8F7D\u4E2D..."},{default:w(()=>[S]),_:1}))}var T=q(C,[["render",A]]);export{T as default};

View File

@@ -1 +1 @@
import{v as L,u as y,y as a,W as j,r as g,o as h,c as v,w as D,B as k,e as x}from"./vendor.627eef95.js";import{D as I,s as _}from"./DocContent.544f7edd.js";import{m as M}from"./index.a17fca00.js";import{_ as q}from"./main.2b6ab185.js";import"./logUtil.8ec1c7d7.js";const S={components:{DocContent:I},setup(){const r=L(),s=y();let d=a("doc"),t=a([]),n=a([]),c=a({url:"",description:"",method:"",consumes:"",produces:""}),o=a(!1),i=0,l;const m=()=>{let P=r.query.path+"."+r.query.method;if(Object.keys(s.state.swaggerUrlMethodMap).length<=0){console.log("\u6587\u6863\u5C1A\u672A\u52A0\u8F7D\uFF0C\u7B49\u5F85\u52A0\u8F7D\u5B8C\u6210"),l||(l=setInterval(()=>{if(o.value||i++>50){clearInterval(l);return}Object.keys(s.state.swaggerUrlMethodMap).length>0&&(console.log("\u6587\u6863\u5185\u5BB9\u6539\u53D8\uFF0C\u91CD\u65B0\u52A0\u8F7D\u6587\u6863"),m())},1e3));return}let e=s.state.swaggerUrlMethodMap[P];if(!e){k.error("\u6CA1\u6709\u627E\u5230\u5BF9\u5E94\u7684\u6587\u6863");return}o.value=!0,s.commit("addTableName",{key:r.fullPath,val:e.summary});let u="",p="";e.consumes&&e.consumes.length>0&&(u=e.consumes.join(" ")),e.produces&&e.produces.length>0&&(p=e.produces.join(" "));let w=M.exports.markdownIt.render(e.description||e.summary||"");c.value={url:e.url,description:w,method:e.method||"",consumes:u,produces:p};let f=s.state.swaggerDefinitions;t.value=_.getRequestParamList(e.parameters,f),n.value=_.getResponseParamList(e.responses,f)};return j(()=>{m()}),{docInfoShow:c,activePage:d,changePage:()=>{},isLoadSuccess:o,requestParamList:t,responseParamList:n}}},C=x("div",{style:{padding:"20px 0",height:"100px"}},null,-1);function b(r,s,d,t,n,c){const o=g("DocContent"),i=g("a-spin");return t.isLoadSuccess?(h(),v(o,{key:0,docInfoShow:t.docInfoShow,requestParamList:t.requestParamList,responseParamList:t.responseParamList},null,8,["docInfoShow","requestParamList","responseParamList"])):(h(),v(i,{key:1,tip:"\u6587\u6863\u6570\u636E\u52A0\u8F7D\u4E2D..."},{default:D(()=>[C]),_:1}))}var V=q(S,[["render",b]]);export{V as default};
import{v as L,u as y,y as a,W as j,r as g,o as h,c as v,w as D,B as k,e as x}from"./vendor.6399378c.js";import{D as I,s as _}from"./DocContent.a9f68c91.js";import{m as M}from"./index.086d0536.js";import{_ as q}from"./main.5fd30069.js";import"./logUtil.6309fa68.js";const S={components:{DocContent:I},setup(){const r=L(),s=y();let m=a("doc"),t=a([]),n=a([]),c=a({url:"",description:"",method:"",consumes:"",produces:""}),o=a(!1),i=0,l;const u=()=>{let P=r.query.path+"."+r.query.method;if(Object.keys(s.state.swaggerUrlMethodMap).length<=0){console.log("\u6587\u6863\u5C1A\u672A\u52A0\u8F7D\uFF0C\u7B49\u5F85\u52A0\u8F7D\u5B8C\u6210"),l||(l=setInterval(()=>{if(o.value||i++>50){clearInterval(l);return}Object.keys(s.state.swaggerUrlMethodMap).length>0&&(console.log("\u6587\u6863\u5185\u5BB9\u6539\u53D8\uFF0C\u91CD\u65B0\u52A0\u8F7D\u6587\u6863"),u())},1e3));return}let e=s.state.swaggerUrlMethodMap[P];if(!e){k.error("\u6CA1\u6709\u627E\u5230\u5BF9\u5E94\u7684\u6587\u6863");return}o.value=!0,s.commit("addTableName",{key:r.fullPath,val:e.summary});let d="",p="";e.consumes&&e.consumes.length>0&&(d=e.consumes.join(" ")),e.produces&&e.produces.length>0&&(p=e.produces.join(" "));let w=M.exports.markdownIt.render(e.description||e.summary||"");c.value={url:e.url,description:w,method:e.method||"",consumes:d,produces:p};let f=s.state.swaggerDefinitions;t.value=_.getRequestParamList(e.parameters,f),n.value=_.getResponseParamList(e.responses,f)};return j(()=>{u()}),{docInfoShow:c,activePage:m,changePage:()=>{},isLoadSuccess:o,requestParamList:t,responseParamList:n}}},C=x("div",{style:{padding:"20px 0",height:"100px"}},null,-1);function B(r,s,m,t,n,c){const o=g("DocContent"),i=g("a-spin");return t.isLoadSuccess?(h(),v(o,{key:0,docInfoShow:t.docInfoShow,requestParamList:t.requestParamList,responseParamList:t.responseParamList},null,8,["docInfoShow","requestParamList","responseParamList"])):(h(),v(i,{key:1,tip:"\u6587\u6863\u6570\u636E\u52A0\u8F7D\u4E2D..."},{default:D(()=>[C]),_:1}))}var V=q(S,[["render",B]]);export{V as default};

View File

@@ -1 +1 @@
var K=Object.defineProperty;var I=Object.getOwnPropertySymbols;var N=Object.prototype.hasOwnProperty,O=Object.prototype.propertyIsEnumerable;var B=(s,e,a)=>e in s?K(s,e,{enumerable:!0,configurable:!0,writable:!0,value:a}):s[e]=a,x=(s,e)=>{for(var a in e||(e={}))N.call(e,a)&&B(s,a,e[a]);if(I)for(var a of I(e))O.call(e,a)&&B(s,a,e[a]);return s};import{z as V}from"./custom.e03d703e.js";import{P as S,a4 as U,R as j,u as A,y as L,W as F,r as m,o as l,b as u,e as z,a as d,w as n,F as f,c as k,t as G,k as b,B as R,m as c}from"./vendor.627eef95.js";import{_ as H}from"./main.2b6ab185.js";const q={components:{PlusOutlined:S,SearchOutlined:U,ReloadOutlined:j},props:{dynamicParam:{type:Object,required:!0}},setup(s){const e=A();let a=L([]),t=L(!1);const h=async()=>{i.value={},t.value=!0,V.docApiGlobalParamList(s.dynamicParam).then(o=>{setTimeout(()=>t.value=!1,500),a.value=o.data||[],e.commit("setGlobalParamOnChange",a.value,s.dynamicParam.id)})};let i=L({}),D=L();const p=()=>{i.value.isEdit&&v(i.value);let o={isEdit:!0,paramType:1};a.value.unshift(o),i.value=o,setTimeout(()=>{let r=document.getElementsByClassName("ant-table-body")[0];r.scrollTop=0},0)},P=o=>{i.value.isEdit&&v(i.value),o.isEdit=!0,i.value=x({},o)},v=o=>{o.isEdit=!1,o.id?a.value.forEach(r=>r.isEdit=!1):a.value=a.value.filter(r=>r!==o),i.value={}},E=o=>{if(!i.value.paramKey||!i.value.paramValue){R.error("\u53C2\u6570\u540D\u6216\u53C2\u6570\u503C\u4E0D\u80FD\u4E3A\u7A7A");return}let r=x(x({},s.dynamicParam),i.value);V.docApiGlobalParamUpdate(r).then(w=>{o.isEdit=!1,h()})},T=async o=>{V.docApiGlobalParamUpdate({id:o.id,yn:0}).then(r=>{h()})};return F(()=>{h()}),{docList:a,docListLoading:t,docEdit:i,tableRef:D,searchDocList:h,deleteDoc:T,editDoc:P,saveEditDoc:E,cancelEditDoc:v,addDocLine:p,docListColumns:[{title:"\u53C2\u6570\u540D\u79F0",dataIndex:"paramKey",width:250},{title:"\u53C2\u6570\u503C",dataIndex:"paramValue"},{title:"\u53C2\u6570\u4F4D\u7F6E",dataIndex:"paramType",width:120},{title:"\u64CD\u4F5C",dataIndex:"operation",fixed:"right",width:170}]}}},M={style:{"margin-bottom":"10px","text-align":"right"}},W=c(" \u5237\u65B0"),J=c(" \u65B0\u5EFA"),Q={key:1},X={key:1},Y=c("Form"),Z=c("Header"),$=c("Cookie"),ee=c("Form"),ae=c("Header"),te=c("Cookie"),oe=c("\u53D6\u6D88"),ne=c("\u4FDD\u5B58"),le=c("\u7F16\u8F91"),ie=c("\u5220\u9664");function de(s,e,a,t,h,i){const D=m("reload-outlined"),p=m("a-button"),P=m("plus-outlined"),v=m("a-input"),E=m("a-select-option"),T=m("a-select"),o=m("a-tag"),r=m("a-popconfirm"),w=m("a-table");return l(),u(f,null,[z("div",M,[d(p,{onClick:t.searchDocList,type:"primary"},{icon:n(()=>[d(D)]),default:n(()=>[W]),_:1},8,["onClick"]),d(p,{onClick:t.addDocLine},{icon:n(()=>[d(P)]),default:n(()=>[J]),_:1},8,["onClick"])]),d(w,{dataSource:t.docList,columns:t.docListColumns,size:"middle",id:"paramTable",loading:t.docListLoading,pagination:!1,scroll:{x:1e3,y:"calc(100vh - 240px)"}},{bodyCell:n(({column:g,text:C,record:y})=>[g.dataIndex==="paramKey"?(l(),u(f,{key:0},[y.isEdit?(l(),k(v,{key:0,placeholder:"\u8BF7\u8F93\u5165\u53C2\u6570\u540D\u79F0",value:t.docEdit.paramKey,"onUpdate:value":e[0]||(e[0]=_=>t.docEdit.paramKey=_)},null,8,["value"])):(l(),u("span",Q,G(C),1))],64)):b("",!0),g.dataIndex==="paramValue"?(l(),u(f,{key:1},[y.isEdit?(l(),k(v,{key:0,rows:1,placeholder:"\u8BF7\u8F93\u5165\u53C2\u6570\u503C",value:t.docEdit.paramValue,"onUpdate:value":e[1]||(e[1]=_=>t.docEdit.paramValue=_)},null,8,["value"])):(l(),u("span",X,G(C),1))],64)):b("",!0),g.dataIndex==="paramType"?(l(),u(f,{key:2},[y.isEdit?(l(),k(T,{key:0,placeholder:"\u53C2\u6570\u4F4D\u7F6E",value:t.docEdit.paramType,"onUpdate:value":e[2]||(e[2]=_=>t.docEdit.paramType=_),style:{width:"110px"}},{default:n(()=>[d(E,{value:1},{default:n(()=>[Y]),_:1}),d(E,{value:2},{default:n(()=>[Z]),_:1}),d(E,{value:3},{default:n(()=>[$]),_:1})]),_:1},8,["value"])):(l(),u(f,{key:1},[C===1?(l(),k(o,{key:0,color:"green"},{default:n(()=>[ee]),_:1})):C===2?(l(),k(o,{key:1,color:"pink"},{default:n(()=>[ae]),_:1})):C===3?(l(),k(o,{key:2,color:"pink"},{default:n(()=>[te]),_:1})):b("",!0)],64))],64)):b("",!0),g.dataIndex==="operation"?(l(),u(f,{key:3},[y.isEdit?(l(),u(f,{key:0},[d(p,{type:"link",onClick:_=>t.cancelEditDoc(y)},{default:n(()=>[oe]),_:2},1032,["onClick"]),d(p,{type:"link",onClick:_=>t.saveEditDoc(y)},{default:n(()=>[ne]),_:2},1032,["onClick"])],64)):(l(),u(f,{key:1},[d(p,{type:"link",onClick:_=>t.editDoc(y)},{default:n(()=>[le]),_:2},1032,["onClick"]),d(r,{title:"\u786E\u5B9A\u8981\u5220\u9664\u5417\uFF1F",onConfirm:_=>t.deleteDoc(y)},{default:n(()=>[d(p,{type:"link",danger:""},{default:n(()=>[ie]),_:1})]),_:2},1032,["onConfirm"])],64))],64)):b("",!0)]),_:1},8,["dataSource","columns","loading","scroll"])],64)}var _e=H(q,[["render",de]]);export{_e as E};
var K=Object.defineProperty;var I=Object.getOwnPropertySymbols;var N=Object.prototype.hasOwnProperty,O=Object.prototype.propertyIsEnumerable;var B=(s,e,a)=>e in s?K(s,e,{enumerable:!0,configurable:!0,writable:!0,value:a}):s[e]=a,x=(s,e)=>{for(var a in e||(e={}))N.call(e,a)&&B(s,a,e[a]);if(I)for(var a of I(e))O.call(e,a)&&B(s,a,e[a]);return s};import{z as V}from"./custom.471d0de0.js";import{P as S,a4 as U,R as j,u as A,y as L,W as F,r as m,o as l,b as u,e as z,a as d,w as n,F as f,c as k,t as G,s as g,B as R,k as c}from"./vendor.6399378c.js";import{_ as H}from"./main.5fd30069.js";const q={components:{PlusOutlined:S,SearchOutlined:U,ReloadOutlined:j},props:{dynamicParam:{type:Object,required:!0}},setup(s){const e=A();let a=L([]),t=L(!1);const h=async()=>{i.value={},t.value=!0,V.docApiGlobalParamList(s.dynamicParam).then(o=>{setTimeout(()=>t.value=!1,500),a.value=o.data||[],e.commit("setGlobalParamOnChange",a.value,s.dynamicParam.id)})};let i=L({}),D=L();const p=()=>{i.value.isEdit&&v(i.value);let o={isEdit:!0,paramType:1};a.value.unshift(o),i.value=o,setTimeout(()=>{let r=document.getElementsByClassName("ant-table-body")[0];r.scrollTop=0},0)},P=o=>{i.value.isEdit&&v(i.value),o.isEdit=!0,i.value=x({},o)},v=o=>{o.isEdit=!1,o.id?a.value.forEach(r=>r.isEdit=!1):a.value=a.value.filter(r=>r!==o),i.value={}},E=o=>{if(!i.value.paramKey||!i.value.paramValue){R.error("\u53C2\u6570\u540D\u6216\u53C2\u6570\u503C\u4E0D\u80FD\u4E3A\u7A7A");return}let r=x(x({},s.dynamicParam),i.value);V.docApiGlobalParamUpdate(r).then(w=>{o.isEdit=!1,h()})},T=async o=>{V.docApiGlobalParamUpdate({id:o.id,yn:0}).then(r=>{h()})};return F(()=>{h()}),{docList:a,docListLoading:t,docEdit:i,tableRef:D,searchDocList:h,deleteDoc:T,editDoc:P,saveEditDoc:E,cancelEditDoc:v,addDocLine:p,docListColumns:[{title:"\u53C2\u6570\u540D\u79F0",dataIndex:"paramKey",width:250},{title:"\u53C2\u6570\u503C",dataIndex:"paramValue"},{title:"\u53C2\u6570\u4F4D\u7F6E",dataIndex:"paramType",width:120},{title:"\u64CD\u4F5C",dataIndex:"operation",fixed:"right",width:170}]}}},M={style:{"margin-bottom":"10px","text-align":"right"}},W=c(" \u5237\u65B0"),J=c(" \u65B0\u5EFA"),Q={key:1},X={key:1},Y=c("Form"),Z=c("Header"),$=c("Cookie"),ee=c("Form"),ae=c("Header"),te=c("Cookie"),oe=c("\u53D6\u6D88"),ne=c("\u4FDD\u5B58"),le=c("\u7F16\u8F91"),ie=c("\u5220\u9664");function de(s,e,a,t,h,i){const D=m("reload-outlined"),p=m("a-button"),P=m("plus-outlined"),v=m("a-input"),E=m("a-select-option"),T=m("a-select"),o=m("a-tag"),r=m("a-popconfirm"),w=m("a-table");return l(),u(f,null,[z("div",M,[d(p,{onClick:t.searchDocList,type:"primary"},{icon:n(()=>[d(D)]),default:n(()=>[W]),_:1},8,["onClick"]),d(p,{onClick:t.addDocLine},{icon:n(()=>[d(P)]),default:n(()=>[J]),_:1},8,["onClick"])]),d(w,{dataSource:t.docList,columns:t.docListColumns,size:"middle",id:"paramTable",loading:t.docListLoading,pagination:!1,scroll:{x:1e3,y:"calc(100vh - 240px)"}},{bodyCell:n(({column:b,text:C,record:y})=>[b.dataIndex==="paramKey"?(l(),u(f,{key:0},[y.isEdit?(l(),k(v,{key:0,placeholder:"\u8BF7\u8F93\u5165\u53C2\u6570\u540D\u79F0",value:t.docEdit.paramKey,"onUpdate:value":e[0]||(e[0]=_=>t.docEdit.paramKey=_)},null,8,["value"])):(l(),u("span",Q,G(C),1))],64)):g("",!0),b.dataIndex==="paramValue"?(l(),u(f,{key:1},[y.isEdit?(l(),k(v,{key:0,rows:1,placeholder:"\u8BF7\u8F93\u5165\u53C2\u6570\u503C",value:t.docEdit.paramValue,"onUpdate:value":e[1]||(e[1]=_=>t.docEdit.paramValue=_)},null,8,["value"])):(l(),u("span",X,G(C),1))],64)):g("",!0),b.dataIndex==="paramType"?(l(),u(f,{key:2},[y.isEdit?(l(),k(T,{key:0,placeholder:"\u53C2\u6570\u4F4D\u7F6E",value:t.docEdit.paramType,"onUpdate:value":e[2]||(e[2]=_=>t.docEdit.paramType=_),style:{width:"110px"}},{default:n(()=>[d(E,{value:1},{default:n(()=>[Y]),_:1}),d(E,{value:2},{default:n(()=>[Z]),_:1}),d(E,{value:3},{default:n(()=>[$]),_:1})]),_:1},8,["value"])):(l(),u(f,{key:1},[C===1?(l(),k(o,{key:0,color:"green"},{default:n(()=>[ee]),_:1})):C===2?(l(),k(o,{key:1,color:"pink"},{default:n(()=>[ae]),_:1})):C===3?(l(),k(o,{key:2,color:"pink"},{default:n(()=>[te]),_:1})):g("",!0)],64))],64)):g("",!0),b.dataIndex==="operation"?(l(),u(f,{key:3},[y.isEdit?(l(),u(f,{key:0},[d(p,{type:"link",onClick:_=>t.cancelEditDoc(y)},{default:n(()=>[oe]),_:2},1032,["onClick"]),d(p,{type:"link",onClick:_=>t.saveEditDoc(y)},{default:n(()=>[ne]),_:2},1032,["onClick"])],64)):(l(),u(f,{key:1},[d(p,{type:"link",onClick:_=>t.editDoc(y)},{default:n(()=>[le]),_:2},1032,["onClick"]),d(r,{title:"\u786E\u5B9A\u8981\u5220\u9664\u5417\uFF1F",onConfirm:_=>t.deleteDoc(y)},{default:n(()=>[d(p,{type:"link",danger:""},{default:n(()=>[ie]),_:1})]),_:2},1032,["onConfirm"])],64))],64)):g("",!0)]),_:1},8,["dataSource","columns","loading","scroll"])],64)}var _e=H(q,[["render",de]]);export{_e as E};

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
import"./custom.471d0de0.js";import{E as a}from"./EditGlobalParam.ede9d5a9.js";import{_ as r}from"./main.5fd30069.js";import{r as t,o as e,c as s}from"./vendor.6399378c.js";const m={components:{EditGlobalParam:a},setup(){return{}}};function n(c,d,p,l,i,_){const o=t("EditGlobalParam");return e(),s(o,{"dynamic-param":{docId:0}})}var G=r(m,[["render",n]]);export{G as default};

View File

@@ -1 +0,0 @@
import"./custom.e03d703e.js";import{E as o}from"./EditGlobalParam.8ab9942d.js";import{_ as r}from"./main.2b6ab185.js";import{r as t,o as e,c as s}from"./vendor.627eef95.js";const m={components:{EditGlobalParam:o},setup(){return{}}};function n(c,p,d,l,i,_){const a=t("EditGlobalParam");return e(),s(a,{"dynamic-param":{docId:0}})}var G=r(m,[["render",n]]);export{G as default};

View File

@@ -0,0 +1 @@
import{_ as e}from"./main.5fd30069.js";import{o as t,b as o}from"./vendor.6399378c.js";const n={name:"SettingView",components:{},data(){return{}},computed:{},mounted(){},methods:{}};function r(a,s,c,m,d,i){return t(),o("div",null," \u5C55\u793A\u914D\u7F6E\u9875\u9762 ")}var f=e(n,[["render",r]]);export{f as default};

View File

@@ -1 +0,0 @@
import{_ as e}from"./main.2b6ab185.js";import{o as t,b as o}from"./vendor.627eef95.js";const n={name:"SettingView",components:{},data(){return{}},computed:{},mounted(){},methods:{}};function r(a,s,c,m,i,p){return t(),o("div",null," \u5C55\u793A\u914D\u7F6E\u9875\u9762 ")}var f=e(n,[["render",r]]);export{f as default};

View File

@@ -1 +1 @@
import{u as p,y as g,W as f,N as x,o as i,b as l,e as _,F as w,d as L,af as N,ag as C,t as I,a9 as S,r as m,a as v,w as u,c as H,k as b}from"./vendor.627eef95.js";import{m as A}from"./index.a17fca00.js";import{_ as y}from"./main.2b6ab185.js";const T={props:{heading:{type:Array,default:[]}},setup(r){const s=p();let a=g("100px");f(()=>{window.onresize=()=>{n()},setTimeout(()=>{n()},100)}),x(s.getters.getLeftAsideWidth,()=>{n()});let e=g();const n=()=>{a.value=window.getComputedStyle(e.value,null).width};return{navigationRef:e,navigationWidth:a,headingItemClick:t=>{t.node.scrollIntoView({behavior:"smooth",block:"start",inline:"nearest"})}}}},D={class:"navigation"},W={ref:"navigationRef",style:{display:"inline-block",width:"100%",height:"1px"}},B=["onClick"];function M(r,s,a,e,n,c){return i(),l("div",D,[_("div",W,null,512),_("div",{class:"navigation-heading",style:N({width:e.navigationWidth})},[(i(!0),l(w,null,L(a.heading,t=>(i(),l("div",{class:C("heading-item heading-"+t.level),onClick:o=>e.headingItemClick(t)},I(t.text),11,B))),256))],4)])}var R=y(T,[["render",M]]);const V={components:{Navigation:R},setup(){const r=p(),s=S(()=>r.state.apiDoc);let a=g();x(r.getters.getApiDoc,()=>{setTimeout(()=>{c(".share-instruction")},100)});const e=t=>A.exports.markdownIt.render(t||"");let n=g([]);const c=t=>{if(!document.querySelector(t))return[];let o=document.querySelector(t).querySelectorAll("h1,h2,h3,h4,h5,h6");if(o.length<=0)return[];let d=[];o.forEach(h=>{let k=h.innerHTML.replace(/^\s+/g,"").replace(/\s+$/g,"").replace(/<\/?[^>]+(>|$)/g,"");d.push({node:h,level:parseInt(h.tagName.replace(/[h]/i,""),10),text:k})}),n.value=d};return f(()=>{}),{apiDoc:s,navigationRef:a,navigationList:n,markdownToHtml:e}}},$={key:0},j=["innerHTML"],q={key:1,style:{"text-align":"center"}};function z(r,s,a,e,n,c){const t=m("Navigation"),o=m("a-col"),d=m("a-row");return e.apiDoc.shareInstruction?(i(),l("div",$,[v(d,null,{default:u(()=>[e.navigationList.length>0?(i(),H(o,{key:0,xs:0,sm:4,md:4,lg:6,xl:6},{default:u(()=>[v(t,{ref:"navigationRef",heading:e.navigationList},null,8,["heading"])]),_:1})):b("",!0),v(o,{xs:24,sm:e.navigationList.length>0?20:24,md:e.navigationList.length>0?20:24,lg:e.navigationList.length>0?18:24,xl:e.navigationList.length>0?18:24},{default:u(()=>[_("div",{class:"markdown-body share-instruction",innerHTML:e.markdownToHtml(e.apiDoc.shareInstruction),style:{margin:"0 auto","max-width":"1000px"}},null,8,j)]),_:1},8,["sm","md","lg","xl"])]),_:1})])):(i(),l("div",q,"\u6B22\u8FCE\u8BBF\u95EE\u5F00\u653EAPI\u6587\u6863"))}var G=y(V,[["render",z]]);export{G as default};
import{u as p,y as g,W as f,N as x,o as i,b as l,e as _,F as k,d as L,af as N,ag as C,t as I,a9 as S,r as m,a as v,w as u,c as H,s as A}from"./vendor.6399378c.js";import{m as T}from"./index.086d0536.js";import{_ as y}from"./main.5fd30069.js";const D={props:{heading:{type:Array,default:[]}},setup(r){const s=p();let a=g("100px");f(()=>{window.onresize=()=>{n()},setTimeout(()=>{n()},100)}),x(s.getters.getLeftAsideWidth,()=>{n()});let e=g();const n=()=>{a.value=window.getComputedStyle(e.value,null).width};return{navigationRef:e,navigationWidth:a,headingItemClick:t=>{t.node.scrollIntoView({behavior:"smooth",block:"start",inline:"nearest"})}}}},b={class:"navigation"},W={ref:"navigationRef",style:{display:"inline-block",width:"100%",height:"1px"}},B=["onClick"];function M(r,s,a,e,n,c){return i(),l("div",b,[_("div",W,null,512),_("div",{class:"navigation-heading",style:N({width:e.navigationWidth})},[(i(!0),l(k,null,L(a.heading,t=>(i(),l("div",{class:C("heading-item heading-"+t.level),onClick:o=>e.headingItemClick(t)},I(t.text),11,B))),256))],4)])}var R=y(D,[["render",M]]);const V={components:{Navigation:R},setup(){const r=p(),s=S(()=>r.state.apiDoc);let a=g();x(r.getters.getApiDoc,()=>{setTimeout(()=>{c(".share-instruction")},100)});const e=t=>T.exports.markdownIt.render(t||"");let n=g([]);const c=t=>{if(!document.querySelector(t))return[];let o=document.querySelector(t).querySelectorAll("h1,h2,h3,h4,h5,h6");if(o.length<=0)return[];let d=[];o.forEach(h=>{let w=h.innerHTML.replace(/^\s+/g,"").replace(/\s+$/g,"").replace(/<\/?[^>]+(>|$)/g,"");d.push({node:h,level:parseInt(h.tagName.replace(/[h]/i,""),10),text:w})}),n.value=d};return f(()=>{}),{apiDoc:s,navigationRef:a,navigationList:n,markdownToHtml:e}}},$={key:0},j=["innerHTML"],q={key:1,style:{"text-align":"center"}};function z(r,s,a,e,n,c){const t=m("Navigation"),o=m("a-col"),d=m("a-row");return e.apiDoc.shareInstruction?(i(),l("div",$,[v(d,null,{default:u(()=>[e.navigationList.length>0?(i(),H(o,{key:0,xs:0,sm:4,md:4,lg:6,xl:6},{default:u(()=>[v(t,{ref:"navigationRef",heading:e.navigationList},null,8,["heading"])]),_:1})):A("",!0),v(o,{xs:24,sm:e.navigationList.length>0?20:24,md:e.navigationList.length>0?20:24,lg:e.navigationList.length>0?18:24,xl:e.navigationList.length>0?18:24},{default:u(()=>[_("div",{class:"markdown-body share-instruction",innerHTML:e.markdownToHtml(e.apiDoc.shareInstruction),style:{margin:"0 auto","max-width":"1000px"}},null,8,j)]),_:1},8,["sm","md","lg","xl"])]),_:1})])):(i(),l("div",q,"\u6B22\u8FCE\u8BBF\u95EE\u5F00\u653EAPI\u6587\u6863"))}var G=y(V,[["render",z]]);export{G as default};

View File

@@ -1 +1 @@
var C=Object.defineProperty,E=Object.defineProperties;var I=Object.getOwnPropertyDescriptors;var L=Object.getOwnPropertySymbols;var O=Object.prototype.hasOwnProperty,D=Object.prototype.propertyIsEnumerable;var x=(r,e,t)=>e in r?C(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t,m=(r,e)=>{for(var t in e||(e={}))O.call(e,t)&&x(r,t,e[t]);if(L)for(var t of L(e))D.call(e,t)&&x(r,t,e[t]);return r},_=(r,e)=>E(r,I(e));import{_ as k}from"./main.2b6ab185.js";import{W as M,y as v,o as j,b as z,e as R}from"./vendor.627eef95.js";const A=["get","head","post","put","patch","delete","options","trace"];function q(r){let e={},t={},n={},h=r.paths;return h?(Object.keys(h).forEach(o=>{let l=h[o];for(let a of A){if(!l[a]||!l[a].tags)continue;let i=a.toLowerCase();n[i]=(n[i]||0)+1,n.total=(n.total||0)+1,l[a].tags.forEach(f=>{let d=e[f];d||(d=e[f]={});let s=d[o];s||(s=d[o]={});let c=o+"."+a;s[a]=l[a],s[a].path=c,s[a].url=o,s[a].method=a,t[c]=l[a]})}}),{urlMethodMap:t,tagPathMap:e,methodStatistic:n}):{urlMethodMap:t,tagPathMap:e,methodStatistic:n}}function G(r,e,t,n){let h=[],o=1,l=r.tags||[];return l.length<=0&&Object.keys(e).forEach(a=>l.push({name:a})),l.forEach(a=>{let i=1,f=[],d=e[a.name];!d||(Object.keys(d).forEach(s=>{let c=1,p=d[s];Object.keys(p).forEach(y=>{let g=o+"_"+i+"_"+c,u=p[y];if(!$(s,u,t))return;u.treeId=g;let T=u.summary||u.path;f.push({title:T,key:g,isLeaf:!0,method:u.method,query:_(m({},n),{path:u.url,method:u.method})}),c++}),i++}),f.length>0&&h.push({title:a.name,key:o,children:f}),o++)}),[{key:"main",title:r.info.title||"Swagger\u63A5\u53E3\u6587\u6863",children:h}]}function $(r,e,t){if(!t||!r||(r=r.toLowerCase(),t=t.toLowerCase(),r.indexOf(t)>=0))return!0;let n=e.path+e.method+e.summary+e.description+e.tags;return n&&n.toLowerCase().indexOf(t)>=0}const P=["get","head","post","put","patch","delete","options","trace"];function H(r){let e={},t={},n={},h=r.paths;return h?(Object.keys(h).forEach(o=>{let l=h[o];for(let a of P){if(!l[a]||!l[a].tags)continue;let i=a.toLowerCase();n[i]=(n[i]||0)+1,n.total=(n.total||0)+1,l[a].tags.forEach(f=>{let d=e[f];d||(d=e[f]={});let s=d[o];s||(s=d[o]={});let c=o+"."+a;s[a]=l[a],s[a].path=c,s[a].url=o,s[a].method=a,t[c]=l[a]})}}),{urlMethodMap:t,tagPathMap:e,methodStatistic:n}):{urlMethodMap:t,tagPathMap:e,methodStatistic:n}}function J(r,e,t,n){let h=[],o=1,l=r.tags||[];return l.length<=0&&Object.keys(e).forEach(a=>l.push({name:a})),l.forEach(a=>{let i=1,f=[],d=e[a.name];!d||(Object.keys(d).forEach(s=>{let c=1,p=d[s];Object.keys(p).forEach(y=>{let g=o+"_"+i+"_"+c,u=p[y];if(!B(s,u,t))return;u.treeId=g;let T=u.summary||u.path;f.push({title:T,key:g,isLeaf:!0,method:u.method,query:_(m({},n),{path:u.url,method:u.method})}),c++}),i++}),f.length>0&&h.push({title:a.name,key:o,children:f}),o++)}),[{key:"main",title:r.info.title||"OpenApi\u63A5\u53E3\u6587\u6863",children:h}]}function B(r,e,t){if(!t||!r||(r=r.toLowerCase(),t=t.toLowerCase(),r.indexOf(t)>=0))return!0;let n=e.path+e.method+e.summary+e.description+e.tags;return n&&n.toLowerCase().indexOf(t)>=0}function K(r,e,t,n){let h=r[0],o=b(h,e,t,n,1);return[{key:"main",isLeaf:!1,title:h.name||"\u81EA\u5EFAAPI\u63A5\u53E3\u6587\u6863",children:o}]}function b(r,e,t,n,h){let o=[];if(!r)return o;let l=1,a=1;return r.children&&r.children.length>0&&r.children.forEach(i=>{n.originNodeMap[i.nodeId]=i;let f=h+"_"+l+"_"+a;if(i.nodeType===1)o.push({title:i.nodeName,key:f,isLeaf:!0,method:i.method,nodeId:i.nodeId,query:_(m({},t),{nodeId:i.nodeId})}),a++;else{let d=b(i,e,t,n,f),s=U(i,e);(d.length>0||s)&&(o.push({title:i.nodeName,key:f,nodeId:i.nodeId,isLeaf:!1,editing:!1,titleEditing:i.nodeName,children:d}),a++)}}),l++,o}function U(r,e){if(!e||!r)return!0;e=e.toLowerCase();let t=r.name;return t&&t.toLowerCase().indexOf(e)>=0}const w={emits:["update:value","change"],setup(r,{emit:e}){M(()=>{o()});let t=v(300),n=v(),h=v();const o=()=>{let l=n.value,a=h.value;l.onmousedown=i=>{let f=i.clientX;return l.style.background="#ccc",a.style.background="#aaa",l.left=l.offsetLeft,document.onmousemove=d=>{let s=d.clientX,c=f-s;(c<0&&t.value<600||c>0&&t.value>300)&&(f=s,t.value-=c,t.value<300&&(t.value=300),e("update:value",t.value),e("change",t.value))},document.onmouseup=()=>{l.style.background="#fafafa",a.style.background="#ccc",document.onmousemove=null,document.onmouseup=null},!1}};return{leftAsideWidth:t,leftResizeRef:n,leftResizeBarRef:h}}},F={ref:"leftResizeRef",class:"left-resize"},S={ref:"leftResizeBarRef"};function X(r,e,t,n,h,o){return j(),z("div",F,[R("i",S,"...",512)],512)}var Q=k(w,[["render",X],["__scopeId","data-v-33303c20"]]),Y="assets/api-logo.952f0c92.png";export{Q as L,Y as _,q as a,H as b,J as c,K as d,G as g};
var E=Object.defineProperty,I=Object.defineProperties;var O=Object.getOwnPropertyDescriptors;var L=Object.getOwnPropertySymbols;var b=Object.prototype.hasOwnProperty,D=Object.prototype.propertyIsEnumerable;var x=(r,e,t)=>e in r?E(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t,m=(r,e)=>{for(var t in e||(e={}))b.call(e,t)&&x(r,t,e[t]);if(L)for(var t of L(e))D.call(e,t)&&x(r,t,e[t]);return r},_=(r,e)=>I(r,O(e));import{_ as k}from"./main.5fd30069.js";import{W as M,y as v,o as j,b as z,e as R}from"./vendor.6399378c.js";const A=["get","head","post","put","patch","delete","options","trace"];function q(r){let e={},t={},n={},h=r.paths;return h?(Object.keys(h).forEach(o=>{let l=h[o];for(let a of A){if(!l[a]||!l[a].tags)continue;let i=a.toLowerCase();n[i]=(n[i]||0)+1,n.total=(n.total||0)+1,l[a].tags.forEach(f=>{let d=e[f];d||(d=e[f]={});let s=d[o];s||(s=d[o]={});let c=o+"."+a;s[a]=l[a],s[a].path=c,s[a].url=o,s[a].method=a,t[c]=l[a]})}}),{urlMethodMap:t,tagPathMap:e,methodStatistic:n}):{urlMethodMap:t,tagPathMap:e,methodStatistic:n}}function G(r,e,t,n){let h=[],o=1,l=r.tags||[];return l.length<=0&&Object.keys(e).forEach(a=>l.push({name:a})),l.forEach(a=>{let i=1,f=[],d=e[a.name];!d||(Object.keys(d).forEach(s=>{let c=1,p=d[s];Object.keys(p).forEach(y=>{let g=o+"_"+i+"_"+c,u=p[y];if(!$(s,u,t))return;u.treeId=g;let T=u.summary||u.path;f.push({title:T,key:g,isLeaf:!0,method:u.method,query:_(m({},n),{path:u.url,method:u.method})}),c++}),i++}),f.length>0&&h.push({title:a.name,key:o,children:f}),o++)}),[{key:"main",title:r.info.title||"Swagger\u63A5\u53E3\u6587\u6863",children:h}]}function $(r,e,t){if(!t||!r||(r=r.toLowerCase(),t=t.toLowerCase(),r.indexOf(t)>=0))return!0;let n=e.path+e.method+e.summary+e.description+e.tags;return n&&n.toLowerCase().indexOf(t)>=0}const P=["get","head","post","put","patch","delete","options","trace"];function H(r){let e={},t={},n={},h=r.paths;return h?(Object.keys(h).forEach(o=>{let l=h[o];for(let a of P){if(!l[a]||!l[a].tags)continue;let i=a.toLowerCase();n[i]=(n[i]||0)+1,n.total=(n.total||0)+1,l[a].tags.forEach(f=>{let d=e[f];d||(d=e[f]={});let s=d[o];s||(s=d[o]={});let c=o+"."+a;s[a]=l[a],s[a].path=c,s[a].url=o,s[a].method=a,t[c]=l[a]})}}),{urlMethodMap:t,tagPathMap:e,methodStatistic:n}):{urlMethodMap:t,tagPathMap:e,methodStatistic:n}}function J(r,e,t,n){let h=[],o=1,l=r.tags||[];return l.length<=0&&Object.keys(e).forEach(a=>l.push({name:a})),l.forEach(a=>{let i=1,f=[],d=e[a.name];!d||(Object.keys(d).forEach(s=>{let c=1,p=d[s];Object.keys(p).forEach(y=>{let g=o+"_"+i+"_"+c,u=p[y];if(!B(s,u,t))return;u.treeId=g;let T=u.summary||u.path;f.push({title:T,key:g,isLeaf:!0,method:u.method,query:_(m({},n),{path:u.url,method:u.method})}),c++}),i++}),f.length>0&&h.push({title:a.name,key:o,children:f}),o++)}),[{key:"main",title:r.info.title||"OpenApi\u63A5\u53E3\u6587\u6863",children:h}]}function B(r,e,t){if(!t||!r||(r=r.toLowerCase(),t=t.toLowerCase(),r.indexOf(t)>=0))return!0;let n=e.path+e.method+e.summary+e.description+e.tags;return n&&n.toLowerCase().indexOf(t)>=0}function K(r,e,t,n){let h=r[0],o=C(h,e,t,n,1);return[{key:"main",isLeaf:!1,title:h.name||"\u81EA\u5EFAAPI\u63A5\u53E3\u6587\u6863",children:o}]}function C(r,e,t,n,h){let o=[];if(!r)return o;let l=1,a=1;return r.children&&r.children.length>0&&r.children.forEach(i=>{n.originNodeMap[i.nodeId]=i;let f=h+"_"+l+"_"+a;if(i.nodeType===1)o.push({title:i.nodeName,key:f,isLeaf:!0,method:i.method,nodeId:i.nodeId,query:_(m({},t),{nodeId:i.nodeId})}),a++;else{let d=C(i,e,t,n,f),s=U(i,e);(d.length>0||s)&&(o.push({title:i.nodeName,key:f,nodeId:i.nodeId,isLeaf:!1,editing:!1,titleEditing:i.nodeName,children:d}),a++)}}),l++,o}function U(r,e){if(!e||!r)return!0;e=e.toLowerCase();let t=r.name;return t&&t.toLowerCase().indexOf(e)>=0}const w={emits:["update:value","change"],setup(r,{emit:e}){M(()=>{o()});let t=v(300),n=v(),h=v();const o=()=>{let l=n.value,a=h.value;l.onmousedown=i=>{let f=i.clientX;return l.style.background="#ccc",a.style.background="#aaa",l.left=l.offsetLeft,document.onmousemove=d=>{let s=d.clientX,c=f-s;(c<0&&t.value<600||c>0&&t.value>300)&&(f=s,t.value-=c,t.value<300&&(t.value=300),e("update:value",t.value),e("change",t.value))},document.onmouseup=()=>{l.style.background="#fafafa",a.style.background="#ccc",document.onmousemove=null,document.onmouseup=null},!1}};return{leftAsideWidth:t,leftResizeRef:n,leftResizeBarRef:h}}},F={ref:"leftResizeRef",class:"left-resize"},S={ref:"leftResizeBarRef"};function X(r,e,t,n,h,o){return j(),z("div",F,[R("i",S,"...",512)],512)}var Q=k(w,[["render",X],["__scopeId","data-v-33303c20"]]),Y="assets/api-logo.952f0c92.png";export{Q as L,Y as _,q as a,H as b,J as c,K as d,G as g};

View File

@@ -0,0 +1 @@
import{B as r}from"./vendor.6399378c.js";var g={log(o,l,s){console.log(o+"-\u9047\u5230\u672A\u5904\u7406\u7684\u7C7B\u578B\uFF0C\u8BF7\u8054\u7CFB\u5F00\u53D1\u4EBA\u5458\u4FEE\u6539\uFF1A"+l,s)},logMessage(o,l,s){console.log(o+"-\u9047\u5230\u672A\u5904\u7406\u7684\u7C7B\u578B\uFF0C\u8BF7\u8054\u7CFB\u5F00\u53D1\u4EBA\u5458\u4FEE\u6539\uFF1A"+l,s),r.error(o+"-\u9047\u5230\u672A\u5904\u7406\u7684\u7C7B\u578B\uFF0C\u8BF7\u8054\u7CFB\u5F00\u53D1\u4EBA\u5458\u4FEE\u6539\uFF1A"+l)}};export{g as l};

View File

@@ -1 +0,0 @@
import{B as s}from"./vendor.627eef95.js";var g={log(o,e,l){console.log(o+"-\u9047\u5230\u672A\u5904\u7406\u7684\u7C7B\u578B\uFF0C\u8BF7\u8054\u7CFB\u5F00\u53D1\u4EBA\u5458\u4FEE\u6539\uFF1A"+e,l)},logMessage(o,e,l){console.log(o+"-\u9047\u5230\u672A\u5904\u7406\u7684\u7C7B\u578B\uFF0C\u8BF7\u8054\u7CFB\u5F00\u53D1\u4EBA\u5458\u4FEE\u6539\uFF1A"+e,l),s.error(o+"-\u9047\u5230\u672A\u5904\u7406\u7684\u7C7B\u578B\uFF0C\u8BF7\u8054\u7CFB\u5F00\u53D1\u4EBA\u5458\u4FEE\u6539\uFF1A"+e)}};export{g as l};

View File

@@ -5,8 +5,8 @@
<link rel="icon" href="api-logo.png" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>API文档管理</title>
<script type="module" crossorigin src="assets/main.2b6ab185.js"></script>
<link rel="modulepreload" href="assets/vendor.627eef95.js">
<script type="module" crossorigin src="assets/main.5fd30069.js"></script>
<link rel="modulepreload" href="assets/vendor.6399378c.js">
<link rel="stylesheet" href="assets/style.9e577f5e.css">
</head>
<body>

View File

@@ -5,4 +5,4 @@
模块的详细使用文档地址,部署必看:
http://doc.zyplayer.com/doc-wiki#/docs/w4eSzPWvQRSBvaCHZS8t6d
http://doc.zyplayer.com

View File

@@ -9,7 +9,7 @@
<parent>
<groupId>com.zyplayer</groupId>
<artifactId>zyplayer-doc</artifactId>
<version>1.1.2</version>
<version>1.0.0</version>
</parent>
<dependencies>
@@ -37,5 +37,9 @@
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-core</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
</project>

View File

@@ -0,0 +1,24 @@
package com.zyplayer.doc.core.enums;
import lombok.Getter;
/**
* 文件存储路径
*
* @author 暮光:城中城
* @since 2023-10-06
*/
public enum PageFileSource {
UPLOAD_FILES(1, "手动上传的附件"),
PASTE_FILES(2, "页面粘贴的图片或文件"),
;
@Getter
private final Integer source;
@Getter
private final String desc;
PageFileSource(Integer source, String desc) {
this.source = source;
this.desc = desc;
}
}

View File

@@ -15,8 +15,8 @@ public enum SystemConfigEnum {
DOC_SYSTEM_VERSION("doc_system_version", "系统当前的版本号"),
;
private String key;
private String desc;
private final String key;
private final String desc;
SystemConfigEnum(String key, String desc) {
this.key = key;

View File

@@ -18,7 +18,7 @@ import java.util.Objects;
* @since 2018年8月21日
*/
public class DocResponseJson<T> implements ResponseJson<T> {
private static SerializeConfig mapping = new SerializeConfig();
private static final SerializeConfig mapping = new SerializeConfig();
static {
mapping.put(Date.class, new SimpleDateFormatSerializer("yyyy-MM-dd HH:mm:ss"));
@@ -134,7 +134,7 @@ public class DocResponseJson<T> implements ResponseJson<T> {
* @since 2018年8月7日
*/
public static <T> DocResponseJson<T> warn(String errMsg) {
return new DocResponseJson<T>(300, errMsg);
return new DocResponseJson<>(300, errMsg);
}
/**
@@ -145,7 +145,7 @@ public class DocResponseJson<T> implements ResponseJson<T> {
* @since 2018年8月7日
*/
public static <T> DocResponseJson<T> error(String errMsg) {
return new DocResponseJson<T>(500, errMsg);
return new DocResponseJson<>(500, errMsg);
}
/**
@@ -156,7 +156,7 @@ public class DocResponseJson<T> implements ResponseJson<T> {
* @since 2018年8月7日
*/
public static <T> DocResponseJson<T> failure(int errCode, String errMsg) {
return new DocResponseJson<T>(errCode, errMsg);
return new DocResponseJson<>(errCode, errMsg);
}
/**

View File

@@ -0,0 +1,17 @@
package com.zyplayer.doc.core.util;
import lombok.Data;
@Data
public class UpgradeInfo {
private String version;
private boolean haveUpgradeSql;
public UpgradeInfo() {
}
public UpgradeInfo(String version, boolean haveUpgradeSql) {
this.version = version;
this.haveUpgradeSql = haveUpgradeSql;
}
}

View File

@@ -10,12 +10,16 @@ import java.util.List;
* @since 2021-06-06
*/
public class ZyplayerDocVersion {
public static final String version = "1.1.2";
public static final String version = "1.1.6";
/**
* 每次升级必须添加一条记录用于执行它的升级SQL
*/
public static final List<String> versionUpgrade = new LinkedList<String>() {{
add("1.1.2");
public static final List<UpgradeInfo> versionUpgrade = new LinkedList<UpgradeInfo>() {{
add(new UpgradeInfo("1.1.6", true));
add(new UpgradeInfo("1.1.5", false));
add(new UpgradeInfo("1.1.4", true));
add(new UpgradeInfo("1.1.3", false));
add(new UpgradeInfo("1.1.2", true));
}};
}

View File

@@ -5,4 +5,4 @@
模块的详细使用文档地址,部署必看:
http://doc.zyplayer.com/doc-wiki#/docs/w4eSzPWvQRSBvaCHZS8t6d
http://doc.zyplayer.com

View File

@@ -9,7 +9,7 @@
<parent>
<groupId>com.zyplayer</groupId>
<artifactId>zyplayer-doc</artifactId>
<version>1.1.2</version>
<version>1.0.0</version>
</parent>
<dependencies>
@@ -51,10 +51,10 @@
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc6</artifactId>
</dependency>
<!-- <dependency>-->
<!-- <groupId>com.oracle</groupId>-->
<!-- <artifactId>ojdbc6</artifactId>-->
<!-- </dependency>-->
<!--达梦数据库驱动-->
<dependency>
<groupId>com.dameng</groupId>
@@ -111,8 +111,6 @@
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>RELEASE</version>
<scope>compile</scope>
</dependency>
</dependencies>

View File

@@ -11,7 +11,10 @@ import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import org.apache.ibatis.mapping.DatabaseIdProvider;
import org.apache.ibatis.mapping.VendorDatabaseIdProvider;
import java.util.Properties;
import javax.annotation.Resource;
import javax.sql.DataSource;
@@ -51,9 +54,21 @@ public class MybatisPlusConfig {
@Bean(name = "manageSqlSessionFactory")
public MybatisSqlSessionFactoryBean manageSqlSessionFactory() throws Exception {
MybatisSqlSessionFactoryBean sqlSessionFactoryBean = new MybatisSqlSessionFactoryBean();
DatabaseIdProvider databaseIdProvider = new VendorDatabaseIdProvider();
Properties properties = new Properties();
properties.setProperty("SQL Server", "sqlserver");
properties.setProperty("DB2", "db2");
properties.setProperty("Oracle", "oracle");
properties.setProperty("MySQL", "mysql");
properties.setProperty("PostgreSQL", "postgresql");
properties.setProperty("Derby", "derby");
properties.setProperty("HSQL", "hsqldb");
properties.setProperty("H2", "h2");
databaseIdProvider.setProperties(properties);
sqlSessionFactoryBean.setDatabaseIdProvider(databaseIdProvider);
sqlSessionFactoryBean.setDataSource(manageDatasource());
sqlSessionFactoryBean.setPlugins(new SqlLogInterceptor(), paginationInterceptor);
PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
sqlSessionFactoryBean.setMapperLocations(resolver.getResources("classpath:/mapper/manage/*Mapper.xml"));
return sqlSessionFactoryBean;

View File

@@ -15,8 +15,9 @@ public class DocUserDetails {
private Long userId;
private String username;
private String password;
private String accessToken;
private boolean enabled;
private List<UserAuthVo> userAuthList;
private List<UserAuthInfo> userAuthList;
public DocUserDetails(Long userId, String username) {
this.userId = userId;
@@ -31,7 +32,7 @@ public class DocUserDetails {
this.enabled = enabled;
}
public DocUserDetails(Long userId, String username, String password, boolean enabled, List<UserAuthVo> userAuthList) {
public DocUserDetails(Long userId, String username, String password, boolean enabled, List<UserAuthInfo> userAuthList) {
super();
this.userId = userId;
this.username = username;

View File

@@ -40,7 +40,7 @@ public class DocUserUtil {
if (currentUser == null) {
return false;
}
Set<String> authCodeSet = currentUser.getUserAuthList().stream().map(UserAuthVo::getAuthCode).collect(Collectors.toSet());
Set<String> authCodeSet = currentUser.getUserAuthList().stream().map(UserAuthInfo::getAuthCode).collect(Collectors.toSet());
for (String authName : authNames) {
if (!authCodeSet.contains(authName)) {
return false;
@@ -69,6 +69,7 @@ public class DocUserUtil {
* 设置当前用户
*/
public static void setCurrentUser(String accessToken, DocUserDetails docUser) {
docUser.setAccessToken(accessToken);
DOC_USER_DETAILS.set(docUser);
CacheUtil.put(accessToken, docUser);
CacheUtil.put(CachePrefix.LOGIN_USER_ID_TOKEN + docUser.getUserId(), accessToken);
@@ -77,7 +78,7 @@ public class DocUserUtil {
/**
* 设置当前用户权限
*/
public static void setUserAuth(Long userId, List<UserAuthVo> userAuthList) {
public static void setUserAuth(Long userId, List<UserAuthInfo> userAuthList) {
String userToken = CacheUtil.get(CachePrefix.LOGIN_USER_ID_TOKEN + userId);
if (userToken != null) {
DocUserDetails docUser = CacheUtil.get(userToken);

View File

@@ -18,11 +18,11 @@ import java.io.Serializable;
*/
@Data
@NoArgsConstructor
public class UserAuthVo implements Serializable {
public class UserAuthInfo implements Serializable {
private static final long serialVersionUID = 1L;
public UserAuthVo(UserAuth userAuth) {
public UserAuthInfo(UserAuth userAuth) {
this.authId = userAuth.getAuthId();
this.sysType = userAuth.getSysType();
this.sysModuleType = userAuth.getSysModuleType();

View File

@@ -0,0 +1,93 @@
package com.zyplayer.doc.data.repository.manage.entity;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.util.Date;
/**
* 备份记录信息
*
* @author diantu
* @since 2023年3月3日
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("backup_log")
public class BackupLog implements Serializable {
/**
* 主键
*/
@TableId(value = "id", type = IdType.AUTO)
private Long id;
/**
* 数据源id
*/
private Long dbId;
/**
* 来源(手动备份|自动备份)
*/
private String category;
/**
* 库名
*/
private String databaseName;
/**
* 表名
*/
private String tablesName;
/**
* 备份方式
*/
private Integer dataType;
/**
* 是否压缩
*/
private Boolean isCompress;
/**
* 是否上传
*/
private Boolean isUpload;
/**
* 是否删除
*/
private Boolean isDelete;
/**
* 文件路径
*/
private String filePath;
/**
* 文件大小
*/
private Long fileSize;
/**
* 备份状态(-1-失败0-备份中1-上传中200-成功)
*/
private Integer status;
/**
* 备份信息
*/
private String msg;
/**
* 开始时间
*/
private Date startTime;
/**
* 结束时间
*/
private Date endTime;
/**
* 耗时(ms)
*/
private Long spendTime;
/**
* 删除状态0--未删除1--已删除)
*/
private Integer delFlag;
}

View File

@@ -0,0 +1,66 @@
package com.zyplayer.doc.data.repository.manage.entity;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.util.Date;
/**
* 备份任务信息
*
* @author diantu
* @since 2023年3月3日
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName(value = "backup_task", autoResultMap = true)
public class BackupTask implements Serializable {
@TableId(value = "id", type = IdType.AUTO)
private Long id;
/**
* 数据源id
*/
private Long dbId;
/**
* cron表达式
*/
private String cron;
/**
* 参数
*/
private String param;
/**
* 状态0-停止1-启动)
*/
private Boolean status;
/**
* 库名
*/
private String databaseName;
/**
* 表名
*/
private String tablesName;
/**
* 备份方式
*/
private Integer dataType;
/**
* 备注
*/
private String remark;
/**
* 创建时间
*/
private Date createTime;
/**
* 删除状态0--未删除1--已删除)
*/
private Integer delFlag;
}

View File

@@ -90,4 +90,9 @@ public class WikiPageFile implements Serializable {
* 文件大小
*/
private Long fileSize;
/**
* 文件来源 1=上传的文件 2=文档内粘贴的图片或文件
*/
private Integer fileSource;
}

View File

@@ -0,0 +1,32 @@
package com.zyplayer.doc.data.repository.manage.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
/**
* <p>
* 模板信息
* </p>
*
* @author Sh1yu
* @since 2023-08-24
*/
@Data
@TableName("wiki_page_template")
public class WikiPageTemplate implements Serializable {
@TableId(value = "id" , type = IdType.AUTO)
private Long id;
private Long spaceId;
private Long pageId;
private String tagName;
private Boolean shareStatus;
private Date created;
private Long createUserId;
private String createUser;
private Integer yn;
}

View File

@@ -0,0 +1,14 @@
package com.zyplayer.doc.data.repository.manage.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.zyplayer.doc.data.repository.manage.entity.BackupTask;
/**
* 备份任务Mapper 接口
*
* @author diantu
* @since 2023-03-03
*/
public interface BackupTaskMapper extends BaseMapper<BackupTask> {
}

View File

@@ -3,7 +3,6 @@ package com.zyplayer.doc.data.repository.manage.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.zyplayer.doc.data.repository.manage.entity.UserInfo;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.ResultType;
import org.apache.ibatis.annotations.Select;
import java.util.List;
@@ -19,15 +18,18 @@ import java.util.Map;
*/
public interface UserInfoMapper extends BaseMapper<UserInfo> {
@Select("show tables")
@Select(value = "show tables")
@Select(value = "SELECT table_name FROM information_schema.tables where table_schema = 'zyplayer_doc'", databaseId="postgresql")
List<String> getTableList();
@Select("${sql}")
List<String> executeSql(@Param("sql") String sql);
@Select("SHOW COLUMNS FROM ${tableName}")
@Select(value = "SELECT * FROM information_schema.columns WHERE table_name = #{tableName} and table_schema = 'zyplayer_doc'", databaseId="postgresql")
List<Map<String, Object>> getTableColumnList(@Param("tableName") String tableName);
@Select("SHOW INDEX FROM ${tableName}")
@Select(value = "SELECT * FROM pg_catalog.pg_indexes WHERE tablename = #{tableName} and schemaname = 'zyplayer_doc'", databaseId="postgresql")
List<Map<String, Object>> getTableIndexList(@Param("tableName") String tableName);
}

View File

@@ -2,10 +2,13 @@ package com.zyplayer.doc.data.repository.manage.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.zyplayer.doc.data.repository.manage.entity.WikiPage;
import com.zyplayer.doc.data.repository.manage.vo.WikiPageTemplateInfoVo;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;
import java.util.List;
/**
* <p>
* Mapper 接口
@@ -24,6 +27,9 @@ public interface WikiPageMapper extends BaseMapper<WikiPage> {
@Select("select max(seq_no) from wiki_page where space_id = #{spaceId} and parent_id=#{parentId} and del_flag=0")
Integer getLastSeq(@Param("spaceId") Long spaceId, @Param("parentId") Long parentId);
@Select("SELECT a.*,b.tag_name AS tags,b.share_status as shareStatus from wiki_page a left join wiki_page_template b on a.space_id =b.space_id and a.id = b.page_id where a.del_flag = 0 and a.space_id =#{spaceId}")
List<WikiPageTemplateInfoVo> getWikiPageTemplateInfos(@Param("spaceId") Long spaceId);
void updateChildrenSeq(@Param("spaceId") Long spaceId, @Param("parentId") Long parentId);
}

View File

@@ -0,0 +1,39 @@
package com.zyplayer.doc.data.repository.manage.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.zyplayer.doc.data.repository.manage.entity.WikiPageTemplate;
import com.zyplayer.doc.data.repository.manage.vo.WikiPageTemplateInfoVo;
import com.zyplayer.doc.data.repository.manage.vo.WikiTemplateTagVo;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* <p>
* 模板的mapper接口
* </p>
*
* @author sh1yu
* @since 2023-08-24
*/
public interface WikiPageTemplateMapper extends BaseMapper<WikiPageTemplate> {
/**
* <p>
* 查询所有的模板
* </p>
*/
List<WikiPageTemplateInfoVo> getAllTemplate(@Param("user") Long user, @Param("name") String name, @Param("share") boolean share, @Param("tags") List tags, @Param("pageNum") Long pageNum);
/*
* 查询所有标签
*/
List<WikiTemplateTagVo> getAllTags(@Param("user") Long user,@Param("open") boolean open);
/*
* 查询模板总数4分页
*/
Long getAllTemplateCount(@Param("user") Long user, @Param("name") String name, @Param("share") boolean share, @Param("tags") List tags);
}

View File

@@ -2,8 +2,6 @@ package com.zyplayer.doc.data.repository.manage.mapper;
import com.zyplayer.doc.data.repository.manage.entity.WikiPageZan;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Update;
/**
* <p>

View File

@@ -18,4 +18,5 @@ public class SearchByEsParam {
private Integer pageSize;
private Integer newsType;
private List<Long> spaceIds;
private Long dirId;
}

View File

@@ -0,0 +1,129 @@
package com.zyplayer.doc.data.repository.manage.vo;
import lombok.Data;
import java.util.Date;
/**
* <p>
* 模板与文档信息的Vo
* </p>
*
* @author Sh1yu
* @since 2023-08-24
*/
@Data
public class WikiPageTemplateInfoVo{
private Long id;
/**
* 空间ID
*/
private Long spaceId;
/**
* 名字
*/
private String name;
/**
* 父ID
*/
private Long parentId;
/**
* 节点类型 0=有子节点 1=终节点
*/
private Integer nodeType;
/**
* 赞的数量
*/
private Integer zanNum;
/**
* 编辑类型 0=可编辑 1=不允许编辑
*/
private Integer editType;
/**
* 是否收藏 0=否 1=是
*/
private Integer favorite;
/**
* 创建人ID
*/
private Long createUserId;
/**
* 创建人名字
*/
private String createUserName;
/**
* 创建时间
*/
private Date createTime;
/**
* 修改人ID
*/
private Long updateUserId;
/**
* 修改人名字
*/
private String updateUserName;
/**
* 修改时间
*/
private Date updateTime;
/**
* 0=有效 1=删除
*/
private Integer delFlag;
/**
* 阅读数
*/
private Integer viewNum;
/**
* 顺序
*/
private Integer seqNo;
/**
* 编辑框类型 1=HTML 2=Markdown
*/
private Integer editorType;
/**
* 模板分享状态 0=个人模板 1=共享模板
*/
private Integer shareStatus;
/**
* 模板ID
*/
private Integer templateId;
/**
* 标签
*/
private String tags;
/**
* 标题
*/
private String title;
/**
* 模板的内容
*/
private String content;
}

View File

@@ -0,0 +1,26 @@
package com.zyplayer.doc.data.repository.manage.vo;
import lombok.Data;
/**
* <p>
* 标签信息的Vo
* </p>
*
* @author Sh1yu
* @since 2023-08-24
*/
@Data
public class WikiTemplateTagVo {
/**
* 是否展示
*/
private boolean show = true;
/**
* 标签名
*/
private String tagName;
}

View File

@@ -7,7 +7,7 @@ package com.zyplayer.doc.data.repository.support.consts;
* @since 2020-06-26
*/
public class DocSysModuleType {
public static enum Manage {
public enum Manage {
USER_MANAGE(1, "用户管理权限"),
;
@@ -28,7 +28,7 @@ public class DocSysModuleType {
}
}
public static enum Wiki {
public enum Wiki {
PAGE(1, "空间"),
;
@@ -49,7 +49,7 @@ public class DocSysModuleType {
}
}
public static enum Db {
public enum Db {
DATASOURCE(1, "数据源管理"),
;
@@ -70,7 +70,7 @@ public class DocSysModuleType {
}
}
public static enum Api {
public enum Api {
DOC(1, "api文档管理"),
;

View File

@@ -11,7 +11,7 @@ public enum UserMsgType {
// 6=wiki文档评论 7=wiki文档删除评论 8=wiki文档上传附件 9=wiki文档修改了父级 10=wiki文档点赞 11=wiki文档附件删除
SIMPLE(1), WIKI_PAGE_CREATE(2), WIKI_PAGE_DELETE(3), WIKI_PAGE_UPDATE(4), WIKI_PAGE_AUTH(5),
WIKI_PAGE_COMMENT(6), WIKI_PAGE_COMMENT_DEL(7), WIKI_PAGE_UPLOAD(8), WIKI_PAGE_PARENT(9), WIKI_PAGE_ZAN(10), WIKI_PAGE_FILE_DEL(11),
WIKI_PAGE_ZAN_CANCEL(12),
WIKI_PAGE_ZAN_CANCEL(12),WIKI_PAGE_MOVE(13),WIKI_PAGE_COPY(14)
// 增加类型的时候需要在zyplayer-doc-ui/wiki-ui/src/components/layouts/GlobalLayout.vue showUserMessage()方法添加类型支持
;

View File

@@ -17,7 +17,7 @@ public class CodeGenerator {
public static void main(String[] args) {
final String[] tableName = {"api_custom_node", "api_custom_params"};
String url = "jdbc:mysql://127.0.0.1:3306/zyplayer_doc_manage?useUnicode=true&useSSL=false&characterEncoding=utf8";
String url = "jdbc:mysql://127.0.0.1:3306/zyplayer_doc?useUnicode=true&useSSL=false&characterEncoding=utf8";
String projectPath = System.getProperty("user.dir") + "/zyplayer-doc-data";
String outputDir = projectPath + "/src/main/java";
String mapperDir = projectPath + "/src/main/resources/mapper/manage/";
@@ -29,23 +29,19 @@ public class CodeGenerator {
.dateType(DateType.ONLY_DATE)
.fileOverride(); // 覆盖已生成文件
})
.packageConfig(builder -> {
builder.parent("com.zyplayer.doc.data") // 设置父包名
.moduleName("") // 设置父包模块名
.controller("web.generator")
.entity("repository.manage.entity")
.mapper("repository.manage.mapper")
.service("service.manage")
.serviceImpl("service.manage.impl")
.pathInfo(Collections.singletonMap(OutputFile.mapperXml, mapperDir));
})
.strategyConfig(builder -> {
builder.addInclude(tableName) // 设置需要生成的表名
.enableCapitalMode()
.serviceBuilder()
.formatServiceFileName("%sService")
.formatServiceImplFileName("%sServiceImpl");
})
.packageConfig(builder -> builder.parent("com.zyplayer.doc.data") // 设置父包名
.moduleName("") // 设置父包模块
.controller("web.generator")
.entity("repository.manage.entity")
.mapper("repository.manage.mapper")
.service("service.manage")
.serviceImpl("service.manage.impl")
.pathInfo(Collections.singletonMap(OutputFile.mapperXml, mapperDir)))
.strategyConfig(builder -> builder.addInclude(tableName) // 设置需要生成的表名
.enableCapitalMode()
.serviceBuilder()
.formatServiceFileName("%sService")
.formatServiceImplFileName("%sServiceImpl"))
.templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎模板默认的是Velocity引擎模板
.execute();
}

View File

@@ -67,7 +67,7 @@ public class SqlLogInterceptor implements Interceptor {
private String getParameterValue(Object obj) {
String value = null;
if (obj instanceof String) {
value = "'" + obj.toString() + "'";
value = "'" + obj + "'";
} else if (obj instanceof Date) {
DateFormat formatter = DateFormat.getDateTimeInstance(DateFormat.DEFAULT, DateFormat.DEFAULT, Locale.CHINA);
value = "'" + formatter.format(obj) + "'";
@@ -87,7 +87,7 @@ public class SqlLogInterceptor implements Interceptor {
List<ParameterMapping> parameterMappings = boundSql.getParameterMappings();
StringBuilder sqlSb = new StringBuilder(boundSql.getSql().replaceAll("[\\s]+", " "));
int fromIndex = 0;
if (parameterMappings.size() > 0 && parameterObject != null) {
if (!parameterMappings.isEmpty() && parameterObject != null) {
TypeHandlerRegistry typeHandlerRegistry = configuration.getTypeHandlerRegistry();
if (typeHandlerRegistry.hasTypeHandler(parameterObject.getClass())) {
//sqlSb = sqlSb.replaceFirst("\\?", getParameterValue(parameterObject));

View File

@@ -5,7 +5,6 @@ import com.baomidou.mybatisplus.extension.service.IService;
import com.zyplayer.doc.data.repository.manage.entity.ApiCustomParams;
import com.zyplayer.doc.data.repository.manage.entity.ApiDoc;
import com.zyplayer.doc.data.repository.manage.vo.ApiCustomDocVo;
import com.zyplayer.doc.data.repository.manage.vo.ApiCustomVo;
import java.util.List;

View File

@@ -18,4 +18,9 @@ public interface DbDatasourceService extends IService<DbDatasource> {
* @return List<DbDatasource>
*/
List<DbDatasource> getDataSourceList();
/**
* 获取数据源
*/
DbDatasource getDataSource(Long sourceId);
}

View File

@@ -3,7 +3,6 @@ package com.zyplayer.doc.data.service.manage;
import com.zyplayer.doc.data.repository.manage.entity.DbTableRelation;
import com.baomidou.mybatisplus.extension.service.IService;
import com.zyplayer.doc.data.repository.manage.param.TableRelationParam;
import com.zyplayer.doc.data.repository.manage.vo.TableRelationVo;
/**
* <p>

View File

@@ -1,7 +1,7 @@
package com.zyplayer.doc.data.service.manage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.zyplayer.doc.data.config.security.UserAuthVo;
import com.zyplayer.doc.data.config.security.UserAuthInfo;
import com.zyplayer.doc.data.repository.manage.entity.UserAuth;
import java.util.List;
@@ -16,7 +16,7 @@ import java.util.List;
*/
public interface UserAuthService extends IService<UserAuth> {
List<UserAuthVo> getUserAuthSet(Long userId);
List<UserAuthInfo> getUserAuthSet(Long userId);
List<UserAuth> getModuleAuthList(Integer sysType, Integer sysModuleType, Long sysModuleId);

View File

@@ -2,6 +2,9 @@ package com.zyplayer.doc.data.service.manage;
import com.zyplayer.doc.data.repository.manage.entity.WikiPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.zyplayer.doc.data.repository.manage.vo.WikiPageTemplateInfoVo;
import java.util.List;
/**
* <p>
@@ -16,4 +19,6 @@ public interface WikiPageService extends IService<WikiPage> {
void changeParent(WikiPage wikiPage, Integer beforeSeq, Integer afterSeq);
void deletePage(WikiPage wikiPage);
List<WikiPageTemplateInfoVo> wikiPageTemplateInfos(Long spaceId);
}

View File

@@ -0,0 +1,40 @@
package com.zyplayer.doc.data.service.manage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.zyplayer.doc.data.repository.manage.entity.WikiPageTemplate;
import com.zyplayer.doc.data.repository.manage.vo.WikiPageTemplateInfoVo;
import com.zyplayer.doc.data.repository.manage.vo.WikiTemplateTagVo;
import java.util.List;
/**
* <p>
* 模板服务接口
* </p>
*
* @author Sh1yu
* @since 2023-08-24
*/
public interface WikiPageTemplateService extends IService<WikiPageTemplate> {
/**
* 根据模板的公开情况获取模板标签
*/
List<WikiTemplateTagVo> getAllTags(Long user, boolean open);
/**
* 根据条件获取模板
*/
WikiPageTemplate getWikiPageTemplateBySpaceAndPage(Long spaceId, Long pageId);
/**
* 根据条件获取模板信息
*/
List<WikiPageTemplateInfoVo> filterAll(Long user, String name, boolean open, List<String> tags, Long pageNum);
/**
* 根据条件获取总条数
*/
Long total(Long user, String name, boolean open, List<String> tags);
}

View File

@@ -6,7 +6,6 @@ import com.zyplayer.doc.data.config.security.DocUserUtil;
import com.zyplayer.doc.data.repository.manage.entity.*;
import com.zyplayer.doc.data.repository.manage.mapper.ApiCustomNodeMapper;
import com.zyplayer.doc.data.repository.manage.vo.ApiCustomDocVo;
import com.zyplayer.doc.data.repository.manage.vo.ApiCustomVo;
import com.zyplayer.doc.data.service.common.ApiDocAuthJudgeService;
import com.zyplayer.doc.data.service.manage.ApiCustomNodeService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;

View File

@@ -12,6 +12,7 @@ import com.zyplayer.doc.data.repository.support.consts.DocSysModuleType;
import com.zyplayer.doc.data.repository.support.consts.DocSysType;
import com.zyplayer.doc.data.service.manage.DbDatasourceService;
import com.zyplayer.doc.data.service.manage.UserAuthService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
@@ -33,6 +34,9 @@ public class DbDatasourceServiceImpl extends ServiceImpl<DbDatasourceMapper, DbD
@Resource
UserAuthService userAuthService;
@Autowired
private DbDatasourceMapper dbDatasourceMapper;
@Override
public List<DbDatasource> getDataSourceList() {
DocUserDetails currentUser = DocUserUtil.getCurrentUser();
@@ -55,6 +59,36 @@ public class DbDatasourceServiceImpl extends ServiceImpl<DbDatasourceMapper, DbD
wrapper.in("id", userAuthDbIds);
}
wrapper.select("id", "name", "group_name");
return list(wrapper);
}
/**
* 获取数据源
*/
@Override
public DbDatasource getDataSource(Long sourceId){
DocUserDetails currentUser = DocUserUtil.getCurrentUser();
QueryWrapper<DbDatasource> wrapper = new QueryWrapper<>();
wrapper.eq("yn", 1);
wrapper.eq("id", sourceId);
// 没管理权限只返回有权限的数据源
if (!DocUserUtil.haveAuth(DocAuthConst.DB_DATASOURCE_MANAGE)) {
QueryWrapper<UserAuth> updateWrapper = new QueryWrapper<>();
updateWrapper.eq("sys_type", DocSysType.DB.getType());
updateWrapper.eq("sys_module_type", DocSysModuleType.Db.DATASOURCE.getType());
updateWrapper.eq("del_flag", 0);
updateWrapper.eq("user_id", currentUser.getUserId());
List<UserAuth> userAuthList = userAuthService.list(updateWrapper);
if (userAuthList == null || userAuthList.isEmpty()) {
return null;
}
List<Long> userAuthDbIds = userAuthList.stream()
.map(UserAuth::getSysModuleId)
.collect(Collectors.toList());
wrapper.in("id", userAuthDbIds);
}
wrapper.select("id", "name", "group_name");
return dbDatasourceMapper.selectOne(wrapper);
}
}

View File

@@ -2,14 +2,10 @@ package com.zyplayer.doc.data.service.manage.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.zyplayer.doc.core.exception.ConfirmException;
import com.zyplayer.doc.data.config.security.UserAuthVo;
import com.zyplayer.doc.data.config.security.UserAuthInfo;
import com.zyplayer.doc.data.repository.manage.entity.AuthInfo;
import com.zyplayer.doc.data.repository.manage.entity.UserAuth;
import com.zyplayer.doc.data.repository.manage.mapper.UserAuthMapper;
import com.zyplayer.doc.data.repository.support.consts.DocAuthConst;
import com.zyplayer.doc.data.repository.support.consts.DocSysModuleType;
import com.zyplayer.doc.data.repository.support.consts.DocSysType;
import com.zyplayer.doc.data.service.manage.AuthInfoService;
import com.zyplayer.doc.data.service.manage.UserAuthService;
import org.apache.commons.collections.CollectionUtils;
@@ -34,9 +30,9 @@ public class UserAuthServiceImpl extends ServiceImpl<UserAuthMapper, UserAuth> i
AuthInfoService authInfoService;
@Override
public List<UserAuthVo> getUserAuthSet(Long userId) {
public List<UserAuthInfo> getUserAuthSet(Long userId) {
QueryWrapper<UserAuth> authWrapper = new QueryWrapper<>();
authWrapper.eq("user_id", userId).eq("del_flag", "0");
authWrapper.eq("user_id", userId).eq("del_flag", 0);
List<UserAuth> userAuthList = this.list(authWrapper);
if (CollectionUtils.isEmpty(userAuthList)) {
return Collections.emptyList();
@@ -45,8 +41,8 @@ public class UserAuthServiceImpl extends ServiceImpl<UserAuthMapper, UserAuth> i
Collection<AuthInfo> authInfoList = authInfoService.listByIds(authIdList);
Map<Long, String> authNameMap = authInfoList.stream().collect(Collectors.toMap(AuthInfo::getId, AuthInfo::getAuthName));
// 组装
List<UserAuthVo> userAuthVoList = userAuthList.stream().map(UserAuthVo::new).collect(Collectors.toList());
for (UserAuthVo userAuthVo : userAuthVoList) {
List<UserAuthInfo> userAuthVoList = userAuthList.stream().map(UserAuthInfo::new).collect(Collectors.toList());
for (UserAuthInfo userAuthVo : userAuthVoList) {
userAuthVo.setAuthCode(authNameMap.get(userAuthVo.getAuthId()));
}
return userAuthVoList;

View File

@@ -22,97 +22,105 @@ import java.util.Objects;
*/
@Service
public class UserMessageServiceImpl extends ServiceImpl<UserMessageMapper, UserMessage> implements UserMessageService {
@Override
public UserMessage createUserMessage(DocUserDetails currentUser, Long dataId, String dataDesc, DocSysType sysType, UserMsgType msgType) {
UserMessage userMessage = new UserMessage();
userMessage.setDataId(dataId);
userMessage.setDataDesc(dataDesc);
userMessage.setSysType(sysType.getType());
userMessage.setMsgType(msgType.getType());
userMessage.setOperatorUserId(currentUser.getUserId());
userMessage.setOperatorUserName(currentUser.getUsername());
return userMessage;
}
@Override
public void addWikiMessage(UserMessage userMessage) {
// 初始值,操作人的消息默认为已读
userMessage.setMsgStatus(1);
userMessage.setCreationTime(new Date());
// 操作人
userMessage.setAcceptUserId(userMessage.getOperatorUserId());
this.setWikiMsgContentForOperator(userMessage);
this.save(userMessage);
// 影响人
if (userMessage.getAffectUserId() != null && !Objects.equals(userMessage.getAffectUserId(), userMessage.getOperatorUserId())) {
userMessage.setId(null);
// 收影响人的消息为未读
userMessage.setMsgStatus(0);
userMessage.setAcceptUserId(userMessage.getAffectUserId());
this.setWikiMsgContentForAffect(userMessage);
this.save(userMessage);
}
// 后期可以添加文档的关注人等
}
/**
* 给操作人发通知的内容
*
* @param userMessage
*/
private void setWikiMsgContentForOperator(UserMessage userMessage) {
if (Objects.equals(UserMsgType.WIKI_PAGE_UPLOAD.getType(), userMessage.getMsgType())) {
userMessage.setMsgContent(String.format("您在‘%s文档内上传了一个附件", userMessage.getDataDesc()));
} else if (Objects.equals(UserMsgType.WIKI_PAGE_AUTH.getType(), userMessage.getMsgType())) {
userMessage.setMsgContent(String.format("您修改了‘%s文档内%s的权限", userMessage.getDataDesc(), userMessage.getAffectUserName()));
} else if (Objects.equals(UserMsgType.WIKI_PAGE_COMMENT.getType(), userMessage.getMsgType())) {
userMessage.setMsgContent(String.format("您评论了‘%s", userMessage.getDataDesc()));
} else if (Objects.equals(UserMsgType.WIKI_PAGE_COMMENT_DEL.getType(), userMessage.getMsgType())) {
userMessage.setMsgContent(String.format("您删除了‘%s文档的评论", userMessage.getDataDesc()));
} else if (Objects.equals(UserMsgType.WIKI_PAGE_PARENT.getType(), userMessage.getMsgType())) {
userMessage.setMsgContent(String.format("您修改了‘%s文档的父级", userMessage.getDataDesc()));
} else if (Objects.equals(UserMsgType.WIKI_PAGE_DELETE.getType(), userMessage.getMsgType())) {
userMessage.setMsgContent(String.format("您删除了‘%s", userMessage.getDataDesc()));
} else if (Objects.equals(UserMsgType.WIKI_PAGE_CREATE.getType(), userMessage.getMsgType())) {
userMessage.setMsgContent(String.format("您创建了‘%s", userMessage.getDataDesc()));
} else if (Objects.equals(UserMsgType.WIKI_PAGE_UPDATE.getType(), userMessage.getMsgType())) {
userMessage.setMsgContent(String.format("您修改了‘%s", userMessage.getDataDesc()));
} else if (Objects.equals(UserMsgType.WIKI_PAGE_ZAN.getType(), userMessage.getMsgType())) {
userMessage.setMsgContent(String.format("您赞同了‘%s", userMessage.getDataDesc()));
} else if (Objects.equals(UserMsgType.WIKI_PAGE_FILE_DEL.getType(), userMessage.getMsgType())) {
userMessage.setMsgContent(String.format("您删除了‘%s文档的一个附件", userMessage.getDataDesc()));
} else if (Objects.equals(UserMsgType.WIKI_PAGE_ZAN_CANCEL.getType(), userMessage.getMsgType())) {
userMessage.setMsgContent(String.format("您取消了对‘%s文档的赞同", userMessage.getDataDesc()));
}
}
/**
* 给影响人发通知的内容
*
* @param userMessage
*/
private void setWikiMsgContentForAffect(UserMessage userMessage) {
if (Objects.equals(UserMsgType.WIKI_PAGE_UPLOAD.getType(), userMessage.getMsgType())) {
userMessage.setMsgContent(String.format("%s为您的文档%s上传了附件", userMessage.getOperatorUserName(), userMessage.getDataDesc()));
} else if (Objects.equals(UserMsgType.WIKI_PAGE_AUTH.getType(), userMessage.getMsgType())) {
userMessage.setMsgContent(String.format("您在‘%s文档内的权限被%s修改了", userMessage.getDataDesc(), userMessage.getOperatorUserName()));
} else if (Objects.equals(UserMsgType.WIKI_PAGE_COMMENT.getType(), userMessage.getMsgType())) {
userMessage.setMsgContent(String.format("您的%s文档收到了来自‘%s的评论", userMessage.getDataDesc(), userMessage.getOperatorUserName()));
} else if (Objects.equals(UserMsgType.WIKI_PAGE_COMMENT_DEL.getType(), userMessage.getMsgType())) {
userMessage.setMsgContent(String.format("%s删除了您的文档‘%s的一条评论", userMessage.getOperatorUserName(), userMessage.getDataDesc()));
} else if (Objects.equals(UserMsgType.WIKI_PAGE_PARENT.getType(), userMessage.getMsgType())) {
userMessage.setMsgContent(String.format("您的‘%s文档被‘%s修改了父级", userMessage.getDataDesc(), userMessage.getOperatorUserName()));
} else if (Objects.equals(UserMsgType.WIKI_PAGE_DELETE.getType(), userMessage.getMsgType())) {
userMessage.setMsgContent(String.format("您的%s文档%s删除了", userMessage.getDataDesc(), userMessage.getOperatorUserName()));
} else if (Objects.equals(UserMsgType.WIKI_PAGE_UPDATE.getType(), userMessage.getMsgType())) {
userMessage.setMsgContent(String.format("您的‘%s文档被%s修改了", userMessage.getDataDesc(), userMessage.getOperatorUserName()));
} else if (Objects.equals(UserMsgType.WIKI_PAGE_ZAN.getType(), userMessage.getMsgType())) {
userMessage.setMsgContent(String.format("您的‘%s文档收到了%s的赞同", userMessage.getDataDesc(), userMessage.getOperatorUserName()));
} else if (Objects.equals(UserMsgType.WIKI_PAGE_FILE_DEL.getType(), userMessage.getMsgType())) {
userMessage.setMsgContent(String.format("您的‘%s文档被%s删除了一个附件", userMessage.getDataDesc(), userMessage.getOperatorUserName()));
} else if (Objects.equals(UserMsgType.WIKI_PAGE_ZAN_CANCEL.getType(), userMessage.getMsgType())) {
userMessage.setMsgContent(String.format("%s取消了对文档‘%s的赞同", userMessage.getOperatorUserName(), userMessage.getDataDesc()));
}
}
@Override
public UserMessage createUserMessage(DocUserDetails currentUser, Long dataId, String dataDesc, DocSysType sysType, UserMsgType msgType) {
UserMessage userMessage = new UserMessage();
userMessage.setDataId(dataId);
userMessage.setDataDesc(dataDesc);
userMessage.setSysType(sysType.getType());
userMessage.setMsgType(msgType.getType());
userMessage.setOperatorUserId(currentUser.getUserId());
userMessage.setOperatorUserName(currentUser.getUsername());
return userMessage;
}
@Override
public void addWikiMessage(UserMessage userMessage) {
// 初始值,操作人的消息默认为已读
userMessage.setMsgStatus(1);
userMessage.setCreationTime(new Date());
// 操作人
userMessage.setAcceptUserId(userMessage.getOperatorUserId());
this.setWikiMsgContentForOperator(userMessage);
this.save(userMessage);
// 影响人
if (userMessage.getAffectUserId() != null && !Objects.equals(userMessage.getAffectUserId(), userMessage.getOperatorUserId())) {
userMessage.setId(null);
// 收影响人的消息为未读
userMessage.setMsgStatus(0);
userMessage.setAcceptUserId(userMessage.getAffectUserId());
this.setWikiMsgContentForAffect(userMessage);
this.save(userMessage);
}
// 后期可以添加文档的关注人等
}
/**
* 给操作人发通知的内容
*
* @param userMessage
*/
private void setWikiMsgContentForOperator(UserMessage userMessage) {
if (Objects.equals(UserMsgType.WIKI_PAGE_UPLOAD.getType(), userMessage.getMsgType())) {
userMessage.setMsgContent(String.format("您在‘%s文档内上传了一个附件", userMessage.getDataDesc()));
} else if (Objects.equals(UserMsgType.WIKI_PAGE_AUTH.getType(), userMessage.getMsgType())) {
userMessage.setMsgContent(String.format("您修改了‘%s文档内%s的权限", userMessage.getDataDesc(), userMessage.getAffectUserName()));
} else if (Objects.equals(UserMsgType.WIKI_PAGE_COMMENT.getType(), userMessage.getMsgType())) {
userMessage.setMsgContent(String.format("您评论了‘%s", userMessage.getDataDesc()));
} else if (Objects.equals(UserMsgType.WIKI_PAGE_COMMENT_DEL.getType(), userMessage.getMsgType())) {
userMessage.setMsgContent(String.format("您删除了‘%s文档的评论", userMessage.getDataDesc()));
} else if (Objects.equals(UserMsgType.WIKI_PAGE_PARENT.getType(), userMessage.getMsgType())) {
userMessage.setMsgContent(String.format("您修改了‘%s文档的父级", userMessage.getDataDesc()));
} else if (Objects.equals(UserMsgType.WIKI_PAGE_DELETE.getType(), userMessage.getMsgType())) {
userMessage.setMsgContent(String.format("您删除了‘%s", userMessage.getDataDesc()));
} else if (Objects.equals(UserMsgType.WIKI_PAGE_CREATE.getType(), userMessage.getMsgType())) {
userMessage.setMsgContent(String.format("您创建了‘%s", userMessage.getDataDesc()));
} else if (Objects.equals(UserMsgType.WIKI_PAGE_UPDATE.getType(), userMessage.getMsgType())) {
userMessage.setMsgContent(String.format("您修改了‘%s", userMessage.getDataDesc()));
} else if (Objects.equals(UserMsgType.WIKI_PAGE_ZAN.getType(), userMessage.getMsgType())) {
userMessage.setMsgContent(String.format("您赞同了‘%s", userMessage.getDataDesc()));
} else if (Objects.equals(UserMsgType.WIKI_PAGE_FILE_DEL.getType(), userMessage.getMsgType())) {
userMessage.setMsgContent(String.format("您删除了‘%s文档的一个附件", userMessage.getDataDesc()));
} else if (Objects.equals(UserMsgType.WIKI_PAGE_ZAN_CANCEL.getType(), userMessage.getMsgType())) {
userMessage.setMsgContent(String.format("您取消了对‘%s文档的赞同", userMessage.getDataDesc()));
} else if (Objects.equals(UserMsgType.WIKI_PAGE_MOVE.getType(), userMessage.getMsgType())) {
userMessage.setMsgContent(String.format("您移动了文档‘%s", userMessage.getDataDesc()));
} else if (Objects.equals(UserMsgType.WIKI_PAGE_COPY.getType(), userMessage.getMsgType())) {
userMessage.setMsgContent(String.format("您复制了文档‘%s", userMessage.getDataDesc()));
}
}
/**
* 给影响人发通知的内容
*
* @param userMessage
*/
private void setWikiMsgContentForAffect(UserMessage userMessage) {
if (Objects.equals(UserMsgType.WIKI_PAGE_UPLOAD.getType(), userMessage.getMsgType())) {
userMessage.setMsgContent(String.format("%s为您的文档‘%s上传了附件", userMessage.getOperatorUserName(), userMessage.getDataDesc()));
} else if (Objects.equals(UserMsgType.WIKI_PAGE_AUTH.getType(), userMessage.getMsgType())) {
userMessage.setMsgContent(String.format("您在%s文档内的权限被‘%s修改了", userMessage.getDataDesc(), userMessage.getOperatorUserName()));
} else if (Objects.equals(UserMsgType.WIKI_PAGE_COMMENT.getType(), userMessage.getMsgType())) {
userMessage.setMsgContent(String.format("您的‘%s文档收到了来自‘%s的评论", userMessage.getDataDesc(), userMessage.getOperatorUserName()));
} else if (Objects.equals(UserMsgType.WIKI_PAGE_COMMENT_DEL.getType(), userMessage.getMsgType())) {
userMessage.setMsgContent(String.format("%s删除了您的文档‘%s的一条评论", userMessage.getOperatorUserName(), userMessage.getDataDesc()));
} else if (Objects.equals(UserMsgType.WIKI_PAGE_PARENT.getType(), userMessage.getMsgType())) {
userMessage.setMsgContent(String.format("您的‘%s文档被%s修改了父级", userMessage.getDataDesc(), userMessage.getOperatorUserName()));
} else if (Objects.equals(UserMsgType.WIKI_PAGE_DELETE.getType(), userMessage.getMsgType())) {
userMessage.setMsgContent(String.format("您的‘%s文档%s删除了", userMessage.getDataDesc(), userMessage.getOperatorUserName()));
} else if (Objects.equals(UserMsgType.WIKI_PAGE_UPDATE.getType(), userMessage.getMsgType())) {
userMessage.setMsgContent(String.format("您的‘%s文档被%s修改了", userMessage.getDataDesc(), userMessage.getOperatorUserName()));
} else if (Objects.equals(UserMsgType.WIKI_PAGE_ZAN.getType(), userMessage.getMsgType())) {
userMessage.setMsgContent(String.format("您的%s文档收到了%s的赞同", userMessage.getDataDesc(), userMessage.getOperatorUserName()));
} else if (Objects.equals(UserMsgType.WIKI_PAGE_FILE_DEL.getType(), userMessage.getMsgType())) {
userMessage.setMsgContent(String.format("您的‘%s文档被%s删除了一个附件", userMessage.getDataDesc(), userMessage.getOperatorUserName()));
} else if (Objects.equals(UserMsgType.WIKI_PAGE_ZAN_CANCEL.getType(), userMessage.getMsgType())) {
userMessage.setMsgContent(String.format("%s取消了对文档%s的赞同", userMessage.getOperatorUserName(), userMessage.getDataDesc()));
}else if (Objects.equals(UserMsgType.WIKI_PAGE_MOVE.getType(), userMessage.getMsgType())) {
userMessage.setMsgContent(String.format("%s移动了文档%s", userMessage.getOperatorUserName(), userMessage.getDataDesc()));
} else if (Objects.equals(UserMsgType.WIKI_PAGE_COPY.getType(), userMessage.getMsgType())) {
userMessage.setMsgContent(String.format("%s复制了文档%s", userMessage.getOperatorUserName(), userMessage.getDataDesc()));
}
}
}

View File

@@ -25,7 +25,7 @@ import java.util.Date;
*/
@Service
public class WikiPageHistoryServiceImpl extends ServiceImpl<WikiPageHistoryMapper, WikiPageHistory> implements WikiPageHistoryService {
private static Logger logger = LoggerFactory.getLogger(WikiPageHistoryServiceImpl.class);
private static final Logger logger = LoggerFactory.getLogger(WikiPageHistoryServiceImpl.class);
@Override
public WikiPageHistory saveRecord(Long spaceId, Long pageId, String content) {

View File

@@ -8,6 +8,7 @@ import com.zyplayer.doc.data.config.security.DocUserUtil;
import com.zyplayer.doc.data.repository.manage.entity.UserMessage;
import com.zyplayer.doc.data.repository.manage.entity.WikiPage;
import com.zyplayer.doc.data.repository.manage.mapper.WikiPageMapper;
import com.zyplayer.doc.data.repository.manage.vo.WikiPageTemplateInfoVo;
import com.zyplayer.doc.data.repository.support.consts.DocSysType;
import com.zyplayer.doc.data.repository.support.consts.UserMsgType;
import com.zyplayer.doc.data.service.manage.UserMessageService;
@@ -70,7 +71,8 @@ public class WikiPageServiceImpl extends ServiceImpl<WikiPageMapper, WikiPage> i
userMessage.setAffectUserId(wikiPage.getCreateUserId());
userMessage.setAffectUserName(wikiPage.getCreateUserName());
userMessageService.addWikiMessage(userMessage);
// 递归删除
// 递归删除,名字不能修改
wikiPage.setName(null);
this.deletePageAndSon(wikiPage);
}
@@ -91,4 +93,8 @@ public class WikiPageServiceImpl extends ServiceImpl<WikiPageMapper, WikiPage> i
this.deletePageAndSon(wikiPage);
}
}
public List<WikiPageTemplateInfoVo> wikiPageTemplateInfos(Long spaceId){
return wikiPageMapper.getWikiPageTemplateInfos(spaceId);
}
}

View File

@@ -0,0 +1,50 @@
package com.zyplayer.doc.data.service.manage.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.zyplayer.doc.data.repository.manage.entity.WikiPageTemplate;
import com.zyplayer.doc.data.repository.manage.mapper.WikiPageTemplateMapper;
import com.zyplayer.doc.data.repository.manage.vo.WikiPageTemplateInfoVo;
import com.zyplayer.doc.data.repository.manage.vo.WikiTemplateTagVo;
import com.zyplayer.doc.data.service.manage.WikiPageTemplateService;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* <p>
* 模板服务实现类
* </p>
*
* @author Sh1yu
* @since 2023-08-24
*/
@Service
public class WikiPageTemplateServiceImpl extends ServiceImpl<WikiPageTemplateMapper, WikiPageTemplate> implements WikiPageTemplateService {
@Override
public List<WikiTemplateTagVo> getAllTags(Long user, boolean open) {
return getBaseMapper().getAllTags(user,open);
}
@Override
public WikiPageTemplate getWikiPageTemplateBySpaceAndPage(Long spaceId, Long pageId) {
QueryWrapper queryWrapper = new QueryWrapper();
queryWrapper.eq("space_id", spaceId);
queryWrapper.eq("page_id", pageId);
return getBaseMapper().selectOne(queryWrapper);
}
@Override
public List<WikiPageTemplateInfoVo> filterAll(Long user, String name, boolean open, List<String> tags, Long pageNum) {
long offset = 0L;
if (null != pageNum && pageNum != 0L) {
offset = (pageNum - 1) * 8;
}
return getBaseMapper().getAllTemplate(user, StringUtils.isBlank(name) ? null : "%" + name + "%", open, tags, offset);
}
@Override
public Long total(Long user, String name, boolean open, List<String> tags) {
return getBaseMapper().getAllTemplateCount(user, name, open, tags);
}
}

View File

@@ -16,7 +16,7 @@ import java.util.concurrent.ConcurrentHashMap;
* @since 2019年05月25日
*/
public class CacheUtil {
private static Logger logger = LoggerFactory.getLogger(CacheUtil.class);
private static final Logger logger = LoggerFactory.getLogger(CacheUtil.class);
// 定期清除过期的key
static {
@@ -49,7 +49,7 @@ public class CacheUtil {
}
// 现在是内存缓存不支持分布式部署后期考虑放到redis但感觉也没必要。。
private static Map<String, CacheData> cacheDataMap = new ConcurrentHashMap<>();
private static final Map<String, CacheData> cacheDataMap = new ConcurrentHashMap<>();
/**
* 放入缓存默认12小时按最后一次访问的12小时

View File

@@ -0,0 +1,43 @@
package com.zyplayer.doc.data.utils;
import lombok.extern.slf4j.Slf4j;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
/**
* 创建一个线程类来不停地来读出Process调用脚本的输出数据防止缓冲区被缓冲数据塞满而线程阻塞
* @author diantu
* @since 2023年3月3日
*/
@Slf4j
public class CleanInputCache extends Thread{
private final String type;
private final String charSet;
private final StringBuilder msg;
private final InputStream inputStream;
public CleanInputCache(InputStream inputStream, String type, String charSet, StringBuilder msg) {
this.type = type;
this.msg = msg;
this.charSet = charSet;
this.inputStream = inputStream;
}
public void run() {
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, charSet));
String line = null;
while ((line = reader.readLine()) != null) {
if ("error".equals(type)) {
msg.append(line);
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}

View File

@@ -14,18 +14,18 @@ import java.util.concurrent.atomic.AtomicLong;
* @since 2020-04-08
*/
public class DruidDataSourceUtil {
private static AtomicLong nameId = new AtomicLong(0);
public static DruidDataSource createDataSource(String driverClassName, String url, String username, String password, boolean breakAfterAcquireFailure) throws Exception {
private static final AtomicLong nameId = new AtomicLong(0);
public static DruidDataSource createDataSource(String driverClassName, String url, String username, String password, boolean breakAfterAcquireFailure) {
// 数据源配置
DruidDataSource dataSource = new DruidDataSource();
dataSource.setDriverClassName(driverClassName);
dataSource.setUrl(url);
dataSource.setUsername(username);
dataSource.setPassword(password);
dataSource.setInitialSize(2);
dataSource.setMinIdle(2);
dataSource.setInitialSize(1);
dataSource.setMinIdle(1);
dataSource.setMaxActive(50);
dataSource.setTestWhileIdle(true);
dataSource.setTestOnBorrow(false);
@@ -43,11 +43,18 @@ public class DruidDataSourceUtil {
if (Objects.equals("oracle.jdbc.driver.OracleDriver", driverClassName)) {
dataSource.setValidationQuery("select 1 from dual");
}
DruidPooledConnection connection = dataSource.getConnection(3000);
if (connection == null) {
try {
DruidPooledConnection connection = dataSource.getConnection(3000);
if (connection == null) {
dataSource.close();
throw new ConfirmException("尝试获取该数据源连接失败:" + url);
}
connection.recycle();
}catch (Exception e){
dataSource.close();
throw new ConfirmException("尝试获取该数据源连接失败:" + url);
}
connection.recycle();
return dataSource;
}
}

View File

@@ -0,0 +1,28 @@
package com.zyplayer.doc.data.utils;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class HtmlUtils {
private static final Logger logger = LoggerFactory.getLogger(HtmlUtils.class);
/**
* 从Content-Disposition头部提取文件名
*
* @param contentDisposition Content-Disposition头部字符串
* @return 文件名如果未找到则返回null
*/
public static String extractFilename(String contentDisposition, String defaultName) {
if (StringUtils.isBlank(contentDisposition)) {
return defaultName;
}
for (String name : contentDisposition.split(";")) {
String[] nameArr = name.trim().split("=");
if (nameArr.length >= 2 && StringUtils.startsWith(nameArr[0], "filename")) {
return StringUtils.removeEnd(StringUtils.removeStart(nameArr[1].trim(), "\""), "\"");
}
}
return defaultName;
}
}

View File

@@ -8,12 +8,17 @@
a.update_time as updateTime, a.name as pageTitle, b.preview as previewContent
from wiki_page a
join wiki_page_content b on b.page_id = a.id
where a.del_flag = 0
where a.del_flag = 0 and a.editor_type != 0
<if test="keywords != null and keywords != ''">
and (
a.name like #{keywords} or b.preview like #{keywords}
)
</if>
<if test="dirId != null and dirId != ''">
and (
a.parent_id = #{dirId}
)
</if>
<if test="spaceIds != null and spaceIds.size > 0">
and a.space_id in
<foreach collection="spaceIds" open="(" close=")" item="item" separator=",">#{item}</foreach>

View File

@@ -12,4 +12,12 @@
set seq_no = b.rownum
where a.parent_id = #{parentId} and a.space_id = #{spaceId};
</update>
<update id="updateChildrenSeq" databaseId="postgresql">
WITH exceeded_wiki_page AS (
select row_number() over() as rownum, * from wiki_page where parent_id = #{parentId} and space_id = #{spaceId} ORDER BY seq_no ASC, update_time DESC
)
UPDATE wiki_page SET seq_no = ewp.rownum
FROM exceeded_wiki_page AS ewp
WHERE wiki_page.id = ewp.id
</update>
</mapper>

View File

@@ -0,0 +1,42 @@
<?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="com.zyplayer.doc.data.repository.manage.mapper.WikiPageTemplateMapper">
<select id="getAllTemplate" resultType="com.zyplayer.doc.data.repository.manage.vo.WikiPageTemplateInfoVo">
SELECT a.*,b.tag_name As tags,b.share_status as shareStatus,c.content,b.id as templateId from wiki_page a
left join wiki_page_template b on a.space_id = b.space_id and a.id = b.page_id
left join wiki_page_content c on a.id = c.page_id
<include refid="queryTemplateByCondition"></include>
order by b.id
limit 8 offset #{pageNum}
</select>
<select id="getAllTemplateCount" resultType="java.lang.Long">
SELECT count(*) from wiki_page a
LEFT JOIN wiki_page_template b on a.space_id = b.space_id and a.id = b.page_id
left join wiki_page_content c on a.id = c.page_id
<include refid="queryTemplateByCondition"></include>
</select>
<select id="getAllTags" resultType="com.zyplayer.doc.data.repository.manage.vo.WikiTemplateTagVo">
select DISTINCT tag_name
from wiki_page_template
where tag_name is not null
and tag_name != ''
and share_status = #{open}
<if test="!open">
and create_user_id = #{user}
</if>
</select>
<sql id="queryTemplateByCondition">
where del_flag = 0 and b.id is not null
and b.share_status = #{share}
<if test="!share">
and b.create_user_id = #{user}
</if>
<if test="name != null and name != ''">
and a.name like #{name}
</if>
<if test="tags != null and tags.size >0 ">
and b.tag_name in
<foreach collection="tags" open="(" close=")" item="item" separator=",">#{item}</foreach>
</if>
</sql>
</mapper>

View File

@@ -23,7 +23,7 @@
<parent>
<groupId>com.zyplayer</groupId>
<artifactId>zyplayer-doc</artifactId>
<version>1.1.2</version>
<version>1.0.0</version>
</parent>
<dependencies>
@@ -35,10 +35,6 @@
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
</dependency>
<dependency>
<groupId>com.zyplayer</groupId>
<artifactId>zyplayer-doc-core</artifactId>
@@ -54,10 +50,13 @@
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>RELEASE</version>
<scope>compile</scope>
</dependency>
</dependencies>
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.3.2</version>
</dependency>
</dependencies>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

View File

@@ -61,6 +61,15 @@ public class DatabaseDocController {
return DocDbResponseJson.ok(dataSourceList);
}
/**
* 获取数据源
*/
@PostMapping("/getDataSource")
public DocDbResponseJson getDataSource(Long sourceId) {
DbDatasource dataSource = dbDatasourceService.getDataSource(sourceId);
return DocDbResponseJson.ok(dataSource);
}
/**
* 获取数据源基本信息
*
@@ -189,10 +198,13 @@ public class DatabaseDocController {
DatabaseExportVo exportVo = new DatabaseExportVo(columnList, tableList);
if (Objects.equals(exportFormat, 1)) {
PoiUtil.exportByText(exportVo, response);
return null;
} else if (Objects.equals(exportFormat, 2)) {
PoiUtil.exportByXlsx(exportVo, response);
return null;
} else if (Objects.equals(exportFormat, 3)) {
PoiUtil.exportByDocx(dbName, exportVo, response);
return null;
}
return DocDbResponseJson.error("导出失败:请先选择导出类型");
} catch (Exception e) {

View File

@@ -40,7 +40,7 @@ import java.util.stream.Stream;
@AuthMan(DocAuthConst.DB_DATASOURCE_MANAGE)
@RequestMapping("/zyplayer-doc-db/auth")
public class DbDataSourceAuthController {
private static Logger logger = LoggerFactory.getLogger(DbDataSourceAuthController.class);
private static final Logger logger = LoggerFactory.getLogger(DbDataSourceAuthController.class);
@Resource
UserInfoService userInfoService;

View File

@@ -43,7 +43,7 @@ import java.util.*;
@RestController
@RequestMapping("/zyplayer-doc-db/data-view")
public class DbDataViewController {
private static Logger logger = LoggerFactory.getLogger(DbDataViewController.class);
private static final Logger logger = LoggerFactory.getLogger(DbDataViewController.class);
@Resource
ExecuteAuthService executeAuthService;
@@ -127,7 +127,7 @@ public class DbDataViewController {
e.printStackTrace();
return DocDbResponseJson.error("导出失败:" + e.getMessage());
}
return DocDbResponseJson.ok();
return null;
}
/**

View File

@@ -40,7 +40,7 @@ import java.util.List;
@RestController
@RequestMapping("/zyplayer-doc-db/procedure")
public class DbProcedureController {
private static Logger logger = LoggerFactory.getLogger(DbProcedureController.class);
private static final Logger logger = LoggerFactory.getLogger(DbProcedureController.class);
@Resource
DatabaseServiceFactory databaseServiceFactory;

View File

@@ -1,7 +1,13 @@
package com.zyplayer.doc.db.controller;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONUtil;
import com.alibaba.druid.DbType;
import com.alibaba.druid.sql.ast.SQLStatement;
import com.alibaba.druid.sql.ast.statement.SQLSelectStatement;
import com.alibaba.druid.sql.parser.SQLStatementParser;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.zyplayer.doc.core.annotation.AuthMan;
import com.zyplayer.doc.data.config.security.DocUserDetails;
@@ -14,14 +20,10 @@ import com.zyplayer.doc.data.repository.support.consts.DocSysType;
import com.zyplayer.doc.data.service.manage.DbFavoriteService;
import com.zyplayer.doc.data.service.manage.DbHistoryService;
import com.zyplayer.doc.db.framework.consts.DbAuthType;
import com.zyplayer.doc.db.framework.db.mapper.base.ExecuteParam;
import com.zyplayer.doc.db.framework.db.mapper.base.ExecuteResult;
import com.zyplayer.doc.db.framework.db.mapper.base.ExecuteType;
import com.zyplayer.doc.db.framework.db.mapper.base.SqlExecutor;
import com.zyplayer.doc.db.framework.db.mapper.base.*;
import com.zyplayer.doc.db.framework.db.transfer.SqlParseUtil;
import com.zyplayer.doc.db.framework.json.DocDbResponseJson;
import com.zyplayer.doc.db.framework.utils.JSONUtil;
import com.zyplayer.doc.db.framework.utils.SqlLogUtil;
import com.zyplayer.doc.db.framework.utils.SQLTransformUtils;
import com.zyplayer.doc.db.service.database.DatabaseServiceFactory;
import com.zyplayer.doc.db.service.database.DbBaseService;
import org.apache.commons.lang3.StringUtils;
@@ -44,10 +46,10 @@ import java.util.*;
@RestController
@RequestMapping("/zyplayer-doc-db/executor")
public class DbSqlExecutorController {
private static Logger logger = LoggerFactory.getLogger(DbSqlExecutorController.class);
private static final Logger logger = LoggerFactory.getLogger(DbSqlExecutorController.class);
@Resource
SqlExecutor sqlExecutor;
ColumnSqlExecutor columnSqlExecutor;
@Resource
DbHistoryService dbHistoryService;
@Resource
@@ -55,8 +57,20 @@ public class DbSqlExecutorController {
@Resource
DatabaseServiceFactory databaseServiceFactory;
/**
* sql执行器
* @param sourceId
* @param executeId
* @param dbName
* @param sql
* @param params
* @param pageSize
* @param pageNum
* @param type noPage:无分页 其他:有分页
* @return
*/
@PostMapping(value = "/execute")
public DocDbResponseJson execute(Long sourceId, String executeId, String dbName, String sql, String params) {
public DocDbResponseJson execute(Long sourceId, String executeId, String dbName, String sql, String params,Integer pageSize,Integer pageNum,String type) {
if (StringUtils.isBlank(sql)) {
return DocDbResponseJson.warn("执行的SQL不能为空");
}
@@ -72,44 +86,108 @@ public class DbSqlExecutorController {
dbHistoryService.saveHistory(sql.trim(), params, sourceId);
// 参数处理
Map<String, Object> paramMap = JSON.parseObject(params);
List<String> resultList = new LinkedList<>();
// 支持;分割的多个sql执行
String[] sqlArr = sql.split(";");
// 执行条数太多,反应慢,展示结果栏太多,也不应该在这一次执行很多条语句,应该使用导入
if (sqlArr.length > 20) {
return DocDbResponseJson.warn("单次执行最多支持20条语句同时执行当前语句条数" + sqlArr.length);
}
for (String sqlItem : sqlArr) {
if (StringUtils.isBlank(sqlItem)) {
continue;
// 解析出多个执行的SQL
List<Map<String,Object>> analysisQuerySqlList = new LinkedList<>();
try {
String driverClassName = dbBaseService.getDatabaseProduct().getDriverClassName();
List<SQLStatement> sqlStatements;
//根据驱动程序类名获取数据库类型
DbType dbType = SQLTransformUtils.getDbTypeByDriverClassName(driverClassName);
sqlStatements = new SQLStatementParser(sql,dbType).parseStatementList();
for (SQLStatement sqlStatement : sqlStatements) {
StringBuffer sb = new StringBuffer(sqlStatement.toString());
if(sb.length()>0&&';' == (sb.charAt(sb.length()-1))){
sb.deleteCharAt(sb.length()-1);
}
Map<String,Object> map = new HashMap<>();
//原始sql
map.put("originalSql",sb);
//sql解析类型
map.put("sqlType","");
//获取数据总量sql
map.put("getAllCountSql","");
//判断sql解析类型
if(sqlStatement instanceof SQLSelectStatement){
map.put("getAllCountSql","select count(1) from ("+sb+") r");
map.put("sqlType","select");
}
analysisQuerySqlList.add(map);
}
sqlItem = sqlItem.trim();
ExecuteResult executeResult;
ExecuteParam executeParam = new ExecuteParam();
} catch (Exception e) {
return DocDbResponseJson.warn("SQL解析失败" + e.getMessage());
}
// 执行条数太多,反应慢,展示结果栏太多,也不应该在这一次执行很多条语句,应该使用导入
if (analysisQuerySqlList.size() > 20) {
return DocDbResponseJson.warn("单次执行最多支持20条语句同时执行当前语句条数" + analysisQuerySqlList.size());
}
List<ColumnExecuteResult> resultList = new LinkedList<>();
for (int i = 0; i < analysisQuerySqlList.size(); i++) {
Map<String, Object> map = analysisQuerySqlList.get(i);
ColumnExecuteResult executeResult;
ColumnExecuteResult executeCountResult;
//原始sql
String originalSql = map.get("originalSql").toString();
try {
ExecuteType executeType = (manageAuth || update) ? ExecuteType.ALL : ExecuteType.SELECT;
executeParam = SqlParseUtil.getSingleExecuteParam(sqlItem, paramMap);
ExecuteParam executeParam = new ExecuteParam();
executeParam.setDatasourceId(sourceId);
executeParam.setExecuteId(executeId);
executeParam.setExecuteType(executeType);
executeParam.setPrefixSql(useDbSql);
executeParam.setMaxRows(1000);
executeResult = sqlExecutor.execute(executeParam);
if(!StrUtil.equals(type,"noPage")){
executeParam.setMaxRows(1000);
}
//sql解析类型为select
if(map.get("sqlType").equals("select")){
if(StrUtil.equals(type,"noPage")){
executeParam = SqlParseUtil.getSingleExecuteParam(executeParam,originalSql, paramMap);
//设置最后一次标志
if(i==analysisQuerySqlList.size()-1){
executeParam.setIsLastTime(true);
}
executeResult = columnSqlExecutor.execute(executeParam);
resultList.add(executeResult);
continue;
}
//获取总数据量sql
String getAllCountSql = map.get("getAllCountSql").toString();
executeParam = SqlParseUtil.getSingleExecuteParam(executeParam,getAllCountSql, paramMap);
executeCountResult = columnSqlExecutor.execute(executeParam);
List<List<Object>> data = executeCountResult.getData();
long count = 0;
if(data!=null){
count = Long.parseLong(data.get(0).get(0)+"");
}
//设置最后一次标志
if(i==analysisQuerySqlList.size()-1){
executeParam.setIsLastTime(true);
}
//总数据量大于1000进行分页
if(count>1000){
String pageSql = dbBaseService.getQueryPageSqlBySql(originalSql,pageSize,pageNum);
executeParam = SqlParseUtil.getSingleExecuteParam(executeParam,pageSql, paramMap);
executeResult = columnSqlExecutor.execute(executeParam);
executeResult.setSelectCount(count);
resultList.add(executeResult);
continue;
}
}
executeParam = SqlParseUtil.getSingleExecuteParam(executeParam,originalSql, paramMap);
executeResult = columnSqlExecutor.execute(executeParam);
} catch (Exception e) {
logger.error("执行出错", e);
executeResult = ExecuteResult.error(e.getMessage(), sqlItem);
executeResult = ColumnExecuteResult.error(originalSql, e.getMessage(), e);
}
// 执行的sql处理
String executeSqlLog = SqlLogUtil.parseLogSql(executeParam.getSql(), executeParam.getParameterMappings(), executeParam.getParamList());
executeResult.setSql(executeSqlLog);
resultList.add(JSON.toJSONString(executeResult, JSONUtil.serializeConfig, SerializerFeature.WriteMapNullValue));
resultList.add(executeResult);
}
return DocDbResponseJson.ok(resultList);
//预处理返回数据(解决大数据量下的性能问题)
JSONArray array = JSONUtil.parseArray(resultList);
return DocDbResponseJson.ok(array);
}
@PostMapping(value = "/cancel")
public DocDbResponseJson cancel(String executeId) {
sqlExecutor.cancel(executeId);
columnSqlExecutor.cancel(executeId);
return DocDbResponseJson.ok();
}

Some files were not shown because too many files have changed in this diff Show More