595 Commits

Author SHA1 Message Date
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
暮光:城中城
84f63adcbc 修改启动说明 2023-02-04 17:26:14 +08:00
暮光:城中城
52167fbaa8 build 2023-02-04 17:15:43 +08:00
暮光:城中城
256fd812c9 修改启动后的访问地址为 /zyplayer-doc 2023-02-04 17:15:02 +08:00
暮光:城中城
ef31ebe52b 1.1.2 release 2023-02-04 17:00:32 +08:00
暮光:城中城
6f68f65e9d 修改文件名字段长度 2023-02-04 16:30:23 +08:00
diantu
ad9d66cee1 readme更新 2023-02-03 18:03:39 +08:00
diantu
848ce44b34 sqlserver->mysql建表语句转换
升级druid版本到最新1.2.14
处理冗余代码
2023-02-03 17:51:42 +08:00
diantu
584fa48d0d 新增达梦数据库支持 2023-02-02 14:36:34 +08:00
diantu
683585c527 mysql->oracle建表语句转换 2023-01-31 15:33:23 +08:00
暮光:城中城
b2740605b0 !11 sql翻译基础框架搭建
Merge pull request !11 from diantu/master
2023-01-30 09:37:35 +00:00
diantu
f599a293fa oracle获取表字段信息增加主键标识 2023-01-30 17:26:56 +08:00
diantu
d8b400189b sql翻译框架基础搭建完成(基于Druid SQL Parser解析SQL实现不同数据库间sql语句互转)
目前已实现oracle->mysql建表语句转换
2023-01-30 14:53:37 +08:00
暮光:城中城
adfd8b24e6 !10 sqlserver兼容性优化
Merge pull request !10 from diantu/master
2023-01-18 04:03:31 +00:00
diantu
e4920791b7 sqlserver兼容性优化 2023-01-18 11:40:47 +08:00
暮光:城中城
299b26579d !9 mysql,oracle数据库bug修复
Merge pull request !9 from diantu/master
2023-01-17 06:39:32 +00:00
diantu
5b39cfe2f1 1.修复mysql数据库因数据库名包含特殊字符导致的报错问题
2.修复oracle分页语句错误
3.oracle表信息sql补全
2023-01-17 13:57:12 +08:00
暮光:城中城
8689918837 !8 mysql数据库名特殊字符问题 ,oracle使用use语句问题
Merge pull request !8 from diantu/master
2023-01-16 07:07:44 +00:00
diantu
b9a1a33c4e 1.修复mysql数据库使用前置sql语句时,因数据库名包含特殊字符导致的报错问题
2.修复oracle使用use语句导致的报错问题
2023-01-16 14:52:35 +08:00
暮光:城中城
602a9cc55c 修改枚举key 2023-01-12 20:09:11 +08:00
暮光:城中城
d29068bb9c 界面展示细节优化 2023-01-11 23:28:20 +08:00
暮光:城中城
b8068ef29e ---wiki正式切换到vue3版本--- 2023-01-11 20:33:42 +08:00
暮光:城中城
bc28320565 优化展示细节 2023-01-11 20:06:53 +08:00
暮光:城中城
c805465684 #I69ZVX 修改不能保存表情问题,优化脚本 2023-01-11 20:06:22 +08:00
暮光:城中城
e54d4972e1 WIKI空间支持分页,页面展示优化 2023-01-10 20:07:00 +08:00
暮光:城中城
1c4230e2d1 #I69PMN 修复模态框点击关闭问题 2023-01-10 20:06:16 +08:00
暮光:城中城
dec28158d2 将wiki升级为vue3版本 2023-01-07 17:38:15 +08:00
暮光:城中城
717d3f39f0 将wiki升级为vue3版本 2023-01-07 16:11:00 +08:00
暮光:城中城
78044ce920 测试升级为vue3 2023-01-07 00:34:05 +08:00
暮光:城中城
e45b63077a 去掉jit依赖 2023-01-05 22:22:33 +08:00
暮光:城中城
b8dcdf93a1 同步闭源版本代码:自动执行升级SQL、历史记录改为数据库存储、去掉git操作,优化代码结构,去掉不需要的文件 2023-01-05 20:13:16 +08:00
护身法
fe1da585ac !7 md预览过滤格式
* 加图标
* utf-8 md过滤格式
* Merge branch 'master' of https://gitee.com/zyplayer/zyplayer-doc
* jar打包 打包版本 tree图标 预览过滤
2023-01-04 09:49:05 +00:00
handy
3829a438e2 !5 一些lombok的使用
使用 @RequiredArgsConstructor 进行注入
使用 @jav 替换logger
优化了import,不导入*
idea自动整理了下代码格式
2022-12-29 09:05:50 +00:00
暮光:城中城
d5636c89dd !4 修复初始化文档菜单显示高亮,修复重复点击菜单文档报错
Merge pull request !4 from 〝走走停停/master
2022-12-26 10:21:11 +00:00
xingxiansheng
458f17f4ac Merge remote-tracking branch 'origin/master' into master 2022-12-26 16:12:57 +08:00
xingxiansheng
9e9c0870ce 修复初始化显示文档菜单显示高亮问题,修复重复点击报错问题 2022-12-26 16:03:31 +08:00
暮光:城中城
1451aff28b 修改插件版本 2022-12-22 18:22:32 +08:00
暮光:城中城
b9eaab37a9 update README.md 2022-12-19 22:42:30 +08:00
暮光:城中城
bddae36b2b !3 添加TableName注解,Db模块更改返回类型
Merge pull request !3 from Mdai/mdai
2022-12-16 06:41:00 +00:00
Mdai
3b993205fb 添加TableName注解,Db模块更改返回类型 2022-12-16 11:47:05 +08:00
暮光:城中城
95ca90a271 !2 添加注释和lombok
Merge pull request !2 from Mdai/mdai
2022-12-15 11:27:53 +00:00
Mdai
c4f024cfad Merge remote-tracking branch 'origin/mdai' into mdai 2022-12-15 19:19:28 +08:00
Mdai
d57289ab60 添加注释和lombok 2022-12-15 19:19:07 +08:00
Mdai
ab4f2787f9 添加注释和lombok 2022-12-15 19:10:20 +08:00
暮光:城中城
e6ac78b91e !1 添加注释和lombok
Merge pull request !1 from Mdai/mdai
2022-12-15 08:23:56 +00:00
Mdai
f60b59b4ca 添加注释和lombok 2022-12-15 16:11:11 +08:00
暮光:城中城
f16950d1ee build 2022-12-07 20:32:43 +08:00
暮光:城中城
d3e3fbd529 build 2022-12-07 20:32:28 +08:00
暮光:城中城
d0e69ef184 同步闭源版本部分代码,修复页面顺序问题 2022-12-07 20:24:17 +08:00
暮光:城中城
f7cfce0bd8 #I636K1 全局搜索优化 2022-12-07 20:23:38 +08:00
暮光:城中城
c62d733869 删除不需要的代码,优化结构 2022-12-07 20:21:18 +08:00
暮光:城中城
e82937297b 1.1.1 release 2022-11-01 22:50:57 +08:00
暮光:城中城
ad1aa476a4 build 2022-08-23 22:55:34 +08:00
暮光:城中城
b11231a940 修改文档地址 2022-08-23 22:51:28 +08:00
暮光:城中城
fb8cacf74b #I5MD1F build 2022-08-17 23:26:54 +08:00
暮光:城中城
30f4ab7c81 #I5MD1F 增加导出为word文档支持 2022-08-17 23:14:40 +08:00
暮光:城中城
df8cc2429e #I5MD1F build 2022-08-16 23:32:11 +08:00
暮光:城中城
d1dddf4ea8 #I5MD1F 增加导出为word文档支持 2022-08-16 23:31:47 +08:00
暮光:城中城
0c4dcf467e #I5MD0X build 2022-08-15 23:53:43 +08:00
暮光:城中城
6d2101837d 路由调整 2022-08-15 23:53:06 +08:00
暮光:城中城
2b5d276afa #I5MD0X 增加修改自己登录密码功能 2022-08-15 23:49:10 +08:00
暮光:城中城
93ef472ea0 #I5LO38 build 2022-08-15 23:00:11 +08:00
暮光:城中城
db6ead2264 #I5LO38 修改自动递增展示字段 2022-08-15 22:57:45 +08:00
暮光:城中城
9500f810af build 2022-07-07 23:43:25 +08:00
暮光:城中城
27cef1077b 修改文档地址 2022-07-07 23:38:41 +08:00
暮光:城中城
7cb77d7bda update README.md. 2022-07-07 10:47:42 +00:00
暮光:城中城
b54fa29587 build 2022-07-05 23:30:24 +08:00
暮光:城中城
77ac039168 fix:标题判断错误问题 2022-07-05 23:28:42 +08:00
暮光:城中城
4a142cee31 build 2022-04-12 19:31:31 +08:00
暮光:城中城
cb3356fb92 #I51E4A 修复无序列表序号显示问题 2022-04-12 19:28:33 +08:00
暮光:城中城
7aad6bf185 #I515TN 解决markdown上传图片错误,build 2022-04-05 22:30:33 +08:00
暮光:城中城
bffcd61b7e 自建api开放文档 2022-03-02 22:39:38 +08:00
暮光:城中城
11456bd3b7 build 2022-01-30 14:49:39 +08:00
暮光:城中城
5bb604ebe3 api接口文档开发 2022-01-30 11:06:48 +08:00
暮光:城中城
c13fb2cae4 wiki编辑器升级,api接口文档开发 2022-01-30 10:24:03 +08:00
暮光:城中城
24f7eb10d0 build 2022-01-16 23:28:17 +08:00
暮光:城中城
14a3eb0c2c 自建API开发 2022-01-16 23:25:59 +08:00
暮光:城中城
551a7079ec api文档开发 2022-01-05 23:06:05 +08:00
暮光:城中城
ec6e31e7c5 域账号登录优化 2022-01-05 23:05:30 +08:00
暮光:城中城
d2705f0313 build 2021-12-28 23:59:05 +08:00
暮光:城中城
74b1b417ad openapi接口文档解析支持 2021-12-28 23:58:43 +08:00
暮光:城中城
bc7ae4fc67 api接口开发 2021-12-27 23:29:04 +08:00
暮光:城中城
990c2379ff fix:值为null时导出的SQL语句使用null,而非空字符串 2021-12-26 22:24:24 +08:00
暮光:城中城
208826df62 自建API接口开发 2021-12-25 20:46:19 +08:00
暮光:城中城
7ce74938e8 build wiki 2021-12-22 23:04:25 +08:00
暮光:城中城
7110ce45cc 增加自建API接口操作 2021-12-22 23:00:10 +08:00
暮光:城中城
956b3b7c19 选中历史版本后重新加载导航 2021-12-22 22:59:33 +08:00
暮光:城中城
45b44a7d13 修改升级内容 2021-12-19 21:49:57 +08:00
暮光:城中城
b7edfe5aa8 1.1.0 release 2021-12-19 20:58:06 +08:00
暮光:城中城
9a60cfe6e3 update README.md 2021-12-17 23:19:19 +08:00
暮光:城中城
0821d59437 update README.md 2021-12-16 22:38:36 +08:00
暮光:城中城
aaf3c811a8 update README.md. 2021-12-16 14:29:58 +00:00
暮光:城中城
8b81f78b29 build 2021-12-15 23:24:22 +08:00
暮光:城中城
e2a8c46afb #I4MKKW api接口调试支持文件上传,全局参数控制优化 2021-12-15 23:20:17 +08:00
暮光:城中城
c176bd7577 ----------------删除暂时不再维护的模块---------------- 2021-12-14 22:30:23 +08:00
暮光:城中城
ab92d6958b 合并api文档编辑页面,体验优化 2021-12-14 22:29:07 +08:00
暮光:城中城
bca4ba34e1 文档管理优化 2021-12-13 23:55:30 +08:00
暮光:城中城
52a01581d4 修改编译打包 2021-12-12 21:45:20 +08:00
暮光:城中城
9dfb8f9ac6 api接口文档支持用户权限控制 2021-12-11 22:36:05 +08:00
暮光:城中城
a2553097bd 用户权限重构 2021-12-10 23:20:42 +08:00
暮光:城中城
6eda8f48c7 左侧菜单宽度拖动改变优化 2021-12-07 22:48:56 +08:00
暮光:城中城
1c747054bb 优化交互,开放文档支持目录导航 2021-12-06 23:03:56 +08:00
暮光:城中城
189e96ff42 api文档支持开放访问 2021-12-05 22:58:48 +08:00
暮光:城中城
928c79b747 修改宽度计算。。。 2021-12-03 00:18:47 +08:00
暮光:城中城
ffa6d669ba 宽度改变时改变导航栏宽度,这次真不自测了。。。我要睡了。。。 2021-12-03 00:08:49 +08:00
暮光:城中城
f86ad19afd 修改打包方式为jar 2021-12-02 23:40:30 +08:00
暮光:城中城
52dce6338f 宽度改变时改变导航栏宽度 2021-12-02 23:39:33 +08:00
暮光:城中城
22a73b445a wiki增加导航和拖动改变左侧菜单宽度功能,编辑器默认改为markdown模式 2021-12-02 23:18:31 +08:00
暮光:城中城
af645464e4 修复wiki有序列表不展示序号问题,测试创建目录导航功能 2021-11-30 23:41:42 +08:00
暮光:城中城
66a6378056 openapi服务地址解析 2021-11-29 23:33:56 +08:00
暮光:城中城
865c14d95b build 2021-11-29 23:20:51 +08:00
暮光:城中城
f587f7c54b 增加对OpenApi文档的解析支持 2021-11-29 23:16:55 +08:00
暮光:城中城
91aef6f9f4 swagger文档管理改为API接口文档管理 2021-11-26 23:51:14 +08:00
暮光:城中城
4408525b45 注释完善 2021-11-24 23:28:49 +08:00
暮光:城中城
aae8a9994a build 2021-11-23 22:59:21 +08:00
暮光:城中城
f9fb9c2f70 说明内容支持markdown格式,文件名、方法名、注释优化 2021-11-23 22:58:10 +08:00
暮光:城中城
b32c9a8f9e 登录会话拦截优化 2021-11-23 22:30:25 +08:00
暮光:城中城
80d525b735 细节优化 2021-11-21 00:07:42 +08:00
暮光:城中城
b432e9fa17 支持path参数 2021-11-20 21:45:29 +08:00
暮光:城中城
ce84b4fee9 参数名设置 2021-11-18 00:03:07 +08:00
暮光:城中城
08df1de2e6 build 2021-11-17 23:11:54 +08:00
暮光:城中城
085b76f4b4 --------去掉对es的支持和依赖,默认去掉对hive的包依赖,maven依赖关系优化,页面位置调整,增加build.bat的支持,支持jar直接启动,去掉历史遗留的无用前端代码,依赖的maven包升级-------- 2021-11-17 22:31:46 +08:00
暮光:城中城
5bdf1ec0c6 build 2021-11-15 23:18:15 +08:00
暮光:城中城
157d06bf8d 支持下载请求,返回值展示优化 2021-11-15 23:11:19 +08:00
暮光:城中城
1ba75d3e29 各异常情况展示优化,增加独立的接口请求页面 2021-11-14 23:05:24 +08:00
暮光:城中城
4254f73603 build 2021-11-09 23:02:07 +08:00
暮光:城中城
cabc693119 全局参数化加入请求参数中,参数支持多行编辑,展示值转换,细节优化 2021-11-09 22:54:37 +08:00
暮光:城中城
265ad08d3e body参数支持数组,cookie参数支持 2021-11-08 23:18:34 +08:00
暮光:城中城
92ac2261be 对象展示说明,支持参数和返回值格式化展示,其他展示优化 2021-11-07 23:06:36 +08:00
暮光:城中城
8c6314de27 build 2021-11-06 23:07:01 +08:00
暮光:城中城
2f1770dcbc 实现swagger的代理请求和数据的格式化展示开发 2021-11-06 22:55:10 +08:00
暮光:城中城
339a29e739 实现swagger的代理请求和拿到返回结果并展示了 2021-11-04 23:43:58 +08:00
暮光:城中城
4487c138b2 在线调试请求参数展示,发送请求 2021-11-03 23:23:29 +08:00
暮光:城中城
e99fe3bf65 文件选择,枚举下拉 2021-11-02 23:49:48 +08:00
暮光:城中城
42ad4916a0 build 2021-11-01 22:54:00 +08:00
暮光:城中城
e07cef459d 调试参数解析展示 2021-11-01 22:51:03 +08:00
暮光:城中城
95f0e26f82 #I4GCYB 文档解析增加$ref类型 2021-11-01 22:45:27 +08:00
暮光:城中城
d3ed4e8334 #I3BMNS 代码块高亮,增加判空和状态判断 2021-11-01 22:44:11 +08:00
暮光:城中城
7b4c1ae455 swagger文档展示优化,调试页面开发 2021-10-31 23:48:55 +08:00
暮光:城中城
9fcdfb7758 swagger文档增加文档搜索和录入示例,修改编辑问题 2021-10-30 22:33:48 +08:00
暮光:城中城
c8f570fa6a swagger查看页面的各种优化,替换首页原有文档入口 2021-10-30 19:52:28 +08:00
暮光:城中城
59ecaf4477 swagger已实现文档的参数和返回值查看 2021-10-28 23:25:12 +08:00
暮光:城中城
3a695ebd1a swagger查看页面路由交互开发 2021-10-26 23:49:47 +08:00
暮光:城中城
395090e958 swagger文档树展示开发 2021-10-26 22:32:42 +08:00
暮光:城中城
1d999710bb 增删改 2021-10-23 23:38:58 +08:00
暮光:城中城
2632fbe1e4 swagger文档增删改开发 2021-10-23 23:13:56 +08:00
暮光:城中城
7e57dbaade 菜单功能开发 2021-10-20 23:34:59 +08:00
暮光:城中城
5cb267fba6 swagger文档展示开发 2021-10-20 22:32:25 +08:00
暮光:城中城
9267aed477 使用vitejs+vue3+antdv重构swagger文档展示 2021-10-17 19:50:22 +08:00
暮光:城中城
28bcbfd379 选择展示的列存储起来,下次使用上次选择的列,数据源列表展示留白 2021-10-04 09:30:08 +08:00
暮光:城中城
59764b69b8 计算选择展示列高度,支持滚动 2021-09-26 22:02:40 +08:00
暮光:城中城
b82f6ae2e0 表数据查看增加选择展示列功能,域账号登录优化 2021-09-25 21:28:37 +08:00
暮光:城中城
27c0d8e50a 多tab标签页切换问题修改 2021-08-16 20:14:19 +08:00
暮光:城中城
04b4794f92 左侧菜单增加数据导出入口,窗口路由优化 2021-08-15 18:03:53 +08:00
暮光:城中城
3b2abbf19f 表数据支持Excel格式导出 2021-08-15 13:40:59 +08:00
暮光:城中城
fa725edd90 数据导出逻辑优化,统一使用一个接口,为下载其他格式做准备 2021-08-14 23:12:51 +08:00
暮光:城中城
c05bc7be80 支持直接删除表的行数据 2021-08-14 12:53:36 +08:00
暮光:城中城
74d5de9c7f 表注释放入字段列表页编辑,其他细节优化 2021-08-08 22:47:38 +08:00
暮光:城中城
1dece8845d SQL编辑器自动提示优化,拖动改变左侧菜单宽度,一些展示优化 2021-08-07 10:00:29 +08:00
暮光:城中城
51f74f60c3 ER图测试,域账号登录测试,修改数据查询的展示问题 2021-08-02 21:18:58 +08:00
暮光:城中城
83ca189598 升级脚本提交 2021-07-25 16:40:45 +08:00
暮光:城中城
862d637075 1.0.9 版本升级 2021-07-25 08:03:42 +08:00
暮光:城中城
7942262eef 控制台跳转优化,关于页面优化 2021-07-22 23:02:37 +08:00
暮光:城中城
783de18e50 控制台跳转优化 2021-07-18 17:03:19 +08:00
暮光:城中城
3e673c14b7 优化关于页面,优化数据源创建失败后的处理 2021-07-17 16:42:44 +08:00
暮光:城中城
1d5c57d516 SQL执行的动态参数保存,数据预览列表头移上去展示列说明 2021-07-17 12:22:51 +08:00
暮光:城中城
eda81c36bc 自动打包至各模块的文件夹内 2021-07-17 12:19:10 +08:00
暮光:城中城
3d774f43bb 编译后的文件同步 2021-07-11 18:59:49 +08:00
暮光:城中城
e509431340 执行器展示和交互优化 2021-07-11 18:57:35 +08:00
暮光:城中城
77ff6722ab 关于页面优化 2021-07-10 19:15:49 +08:00
暮光:城中城
ddbadcd1e8 关于页面优化 2021-07-08 23:10:47 +08:00
暮光:城中城
03dff7620e sql执行增加动态参数功能 2021-06-27 22:45:30 +08:00
暮光:城中城
6da66fac7c 升级sql文件 2021-06-21 23:52:26 +08:00
暮光:城中城
5abe56caad SQL编辑器自动提示库、表、列逻辑优化,更加好用 2021-06-20 17:47:46 +08:00
暮光:城中城
a30d9318da 优化SQL编辑器引入方式,优化自动提示,优化sqlserver表、字段注释获取和更新方式,数据查询时改为需指定数据库,便于库表检索提示 2021-06-20 00:41:28 +08:00
暮光:城中城
da9146f75f sqlserver数据库查询和导出开发测试 2021-06-17 23:34:48 +08:00
暮光:城中城
01ab1d6079 关系图和数据预览优化 2021-06-09 00:05:25 +08:00
暮光:城中城
1d5e0e2bf1 表数据导出优化,增加表关系图功能 2021-06-08 23:04:15 +08:00
暮光:城中城
dcbb2b4ac8 数据表信息查看页面优化,合并数据查看页面 2021-06-06 22:43:16 +08:00
暮光:城中城
b1fefdeba7 数据导出功能完善 2021-06-05 18:58:32 +08:00
暮光:城中城
694f847f1d 表数据导出支持 2021-06-05 16:38:27 +08:00
暮光:城中城
9e3f479b3e 修改一些展示问题 2021-06-01 22:34:21 +08:00
暮光:城中城
40a3db911d 去掉一些感觉没用的插件 2021-05-31 22:57:19 +08:00
暮光:城中城
50a1f794c2 复制语句修改,日志打印优化 2021-05-31 22:44:12 +08:00
暮光:城中城
089fab958d 更新的条件支持选择列 2021-05-29 22:18:15 +08:00
暮光:城中城
c56613bc63 wiki查看页面优化 2021-05-24 22:42:50 +08:00
暮光:城中城
206f410573 数据查看优化,执行器支持复制为insert、update、json格式 2021-05-24 22:42:01 +08:00
暮光:城中城
9992ca9183 #I2BC14 移动端展示适配优化 2021-05-20 00:05:30 +08:00
暮光:城中城
8fa04b9973 数据预览优化,SQL组装移到后端 2021-05-20 00:04:07 +08:00
暮光:城中城
dcf487d55c #I2BC14 手机端查看页面适配 2021-05-14 23:45:12 +08:00
暮光:城中城
477fef11d3 测试vant移动端框架 2021-05-13 22:59:04 +08:00
暮光:城中城
ff5434a173 测试wiki的移动端展示 2021-05-13 22:02:10 +08:00
暮光:城中城
da5e0e5017 轻轻的优化了一下数据库框架 2021-05-13 22:01:41 +08:00
暮光:城中城
09d6ccca57 增加hive和impala数据源支持 2021-05-11 23:14:44 +08:00
暮光:城中城
2fab0d6a80 1.0.8 版本升级 2021-05-01 17:35:39 +08:00
暮光:城中城
4dec5b73f4 update README.md. 2021-05-01 17:04:46 +08:00
暮光:城中城
58976dc829 库函数增加修改日志记录,增加函数修改授权,展示优化 2021-04-27 23:24:21 +08:00
暮光:城中城
744e877309 增加数据库函数和存储过程的增删改查支持,优化数据源管理 2021-04-25 21:56:27 +08:00
暮光:城中城
f270a9bb12 DDL多数据源支持,虽然还没实现 2021-04-23 22:58:16 +08:00
暮光:城中城
e0e59cc82e 变量初始化 2021-04-19 15:06:13 +08:00
暮光:城中城
a153809649 用户支持分组,wiki空间支持按分组授权,细节优化 2021-02-09 22:57:52 +08:00
暮光:城中城
13d6f3ca8b 数据库文档查询优化 2021-02-01 21:50:46 +08:00
暮光:城中城
8a3f40c394 导出库表支持建表语句的导出 2021-01-31 22:04:27 +08:00
暮光:城中城
b252eeb33b 库列表增加刷新功能 2021-01-23 13:30:27 +08:00
暮光:城中城
91e7b0eb33 修改查询权限限制 2021-01-16 16:05:50 +08:00
暮光:城中城
7c8a1e7ebc 修改开放文档样式问题 2021-01-12 20:47:16 +08:00
暮光:城中城
0f72acc973 fix:I2CG72 wiki文档搜索时忽略大小写 2021-01-09 18:25:41 +08:00
暮光:城中城
e66586c765 ddl支持复制和高亮,postgresql支持 2021-01-06 23:53:14 +08:00
暮光:城中城
e949570c1a 数据库增加postgresql支持,展示优化 2021-01-06 22:32:12 +08:00
暮光:城中城
6cb2d76bfb 开放wiki页文档样式修改,支持图片预览 2021-01-06 22:30:04 +08:00
暮光:城中城
2dfb089665 升级说明修改 2021-01-01 21:54:08 +08:00
暮光:城中城
911410027d 1.0.7版本升级 2021-01-01 19:31:08 +08:00
暮光:城中城
861762e005 wiki文章列表左右滚动优化 2021-01-01 19:30:31 +08:00
暮光:城中城
8b106c4588 wiki历史文档图片预览支持 2021-01-01 18:23:24 +08:00
暮光:城中城
8767acf080 markdown格式展示样式修改 2021-01-01 17:58:28 +08:00
暮光:城中城
3fbc7e5b38 wiki图片预览遮罩点击后隐藏预览框 2020-12-27 17:17:55 +08:00
暮光:城中城
b7654611c7 wiki文章增加图片预览功能 2020-12-27 15:58:23 +08:00
暮光:城中城
64572e52ef wiki附件展示大小,用户名展示,其他展示优化 2020-12-27 14:25:38 +08:00
暮光:城中城
bd2d08c9ff #I262OZ 编辑框高度自适应 2020-12-26 13:43:19 +08:00
暮光:城中城
b8a1c8554e 控制台只展示有权限的菜单,登录和提示优化 2020-12-26 10:33:24 +08:00
暮光:城中城
2e37d4db44 登录页优化,消息提示优化 2020-12-25 22:22:51 +08:00
暮光:城中城
a5fcdea2fa 控制台前端页面升级 2020-12-20 21:59:09 +08:00
暮光:城中城
dfb1e62074 获取dubbo服务优化 2020-12-20 21:58:34 +08:00
暮光:城中城
d1918b14e2 wiki不能保存问题修复,数据源创建优化 2020-12-15 12:15:39 +08:00
暮光:城中城
7285947cb3 dubbo文档覆盖优化,线程安全处理,文档优化 2020-12-09 18:18:04 +08:00
暮光:城中城
95ec165d49 dubbo文档优化 2020-11-18 00:37:26 +08:00
暮光:城中城
e0289aa247 测试加载外部jar读取类信息 2020-10-31 20:47:52 +08:00
暮光:城中城
ccf4196f0e dubbo文档UI初始化 2020-10-27 23:15:42 +08:00
暮光:城中城
3048d203ff 修改消息提示,必要的异常判断 2020-10-27 22:51:32 +08:00
暮光:城中城
cec0e2d5c8 #I1XRJM wiki文档样式处理 2020-10-11 21:45:17 +08:00
暮光:城中城
38b04972b6 #I1XRJM markdown粘贴图片使用文件方式上传保存 2020-10-10 20:46:35 +08:00
暮光:城中城
974793cdff 修改脚本 2020-09-11 01:16:11 +08:00
暮光:城中城
b05c2158de wiki历史支持push到远程仓库,防止丢失 2020-09-07 21:07:30 +08:00
暮光:城中城
7405d3d711 修改注释行不能点击问题 2020-09-07 21:06:12 +08:00
暮光:城中城
23461e7337 修改关于说明文案 2020-09-06 21:49:09 +08:00
暮光:城中城
d0fa28eebe wiki历史记录滚动加载分页 2020-09-06 21:26:26 +08:00
暮光:城中城
08bdaabcf5 数据库导出新窗口使用post方式提交,更加优雅 2020-09-06 16:26:39 +08:00
暮光:城中城
f602ccf2a4 数据库包导出增加表信息列表导出 2020-09-06 16:04:33 +08:00
暮光:城中城
942b25e9ce 修改Markdown格式的历史版本显示问题 2020-09-06 14:36:26 +08:00
暮光:城中城
a01699bd12 增加git目录判断,完善注释 2020-09-06 10:39:09 +08:00
暮光:城中城
5cd766762a wiki增加历史版本功能,原创使用git方式管理wiki历史版本和查看,修改评论展示区域,修改布局 2020-09-06 10:32:31 +08:00
暮光:城中城
85bbfd1233 update README.md. 2020-09-03 18:57:24 +08:00
暮光:城中城
a8d74a348a 1.0.6版本升级 2020-08-23 14:27:13 +08:00
暮光:城中城
da5188d840 fix:编辑器图片上传问题 2020-08-23 13:13:57 +08:00
暮光:城中城
96079c8fa1 完善文档 2020-08-23 12:29:56 +08:00
暮光:城中城
44ebfbf554 #I1QU0R 数据库文档增加Word导出支持 2020-08-22 10:20:44 +08:00
暮光:城中城
6d2e24f455 wiki优化 2020-08-02 18:02:37 +08:00
暮光:城中城
e281b5d47d 前端打包 2020-06-26 15:41:07 +08:00
暮光:城中城
c98c3f1209 前端打包 2020-06-26 15:37:02 +08:00
暮光:城中城
842b19a378 评论的展示、已读及跳转,消息接口优化 2020-06-26 15:34:07 +08:00
暮光:城中城
fbfede7663 优化wiki文档上传,增加消息提醒功能 2020-06-26 11:23:26 +08:00
暮光:城中城
1dd6588d63 增加Markdown格式编辑方式和查看,增加快速打开开放文档地址 2020-06-21 22:52:45 +08:00
暮光:城中城
cb7cce2b98 优化wiki文档展示 2020-06-19 22:22:52 +08:00
暮光:城中城
1abcc4f92e #I1KQUK 开放地址首页展示优化,优化查看编辑页展示及url参数,无权限时不展示对应按钮 2020-06-16 23:13:27 +08:00
暮光:城中城
0451b9319c 前端打包 2020-06-15 22:54:15 +08:00
暮光:城中城
c9e57ba84a #I1KMTP 增加删除评论功能 2020-06-15 22:43:20 +08:00
暮光:城中城
74d1c06561 修改开放文档页面位置 2020-06-15 22:41:11 +08:00
暮光:城中城
61f4c316d8 编辑器增加撤销、重做功能开发 2020-06-14 22:24:35 +08:00
暮光:城中城
39783b3467 编辑器增加撤销、重做功能,编辑优化 2020-06-14 21:20:23 +08:00
暮光:城中城
fad50328b6 编辑器2.0开发 2020-06-13 22:51:29 +08:00
暮光:城中城
61938a840f 编辑器开发测试 2020-06-13 20:37:18 +08:00
暮光:城中城
cafe72fcc2 编辑器开发 2020-06-07 23:12:48 +08:00
暮光:城中城
0965f44866 wiki调试修改,增加自研编辑器 2020-06-06 15:34:49 +08:00
暮光:城中城
2d9a5ab6b6 错误解决 2020-05-29 22:43:20 +08:00
暮光:城中城
13ddbc05ee 改为使用vue-cli打包,修改所有的请求方式 2020-05-29 22:38:25 +08:00
暮光:城中城
ba29b57a14 展示细节优化 2020-05-24 13:00:43 +08:00
暮光:城中城
88686f84f4 改为使用vue-cli打包,修改所有的请求方式,优化页面间的交互,增加数据源分组 2020-05-23 12:21:23 +08:00
暮光:城中城
adadffa0cd 增加数据源测试 2020-05-17 21:42:49 +08:00
暮光:城中城
33229dd85a update README.md. 2020-05-16 13:02:08 +08:00
暮光:城中城
c64be60263 1.0.5版本升级 2020-05-16 10:53:55 +08:00
暮光:城中城
c89f3696ea 优化数据源初始化和获取逻辑 2020-05-16 08:54:11 +08:00
暮光:城中城
18d8105344 增加sql美化功能,界面优化 2020-05-12 22:29:29 +08:00
暮光:城中城
fb38b86b82 前端打包编译 2020-05-11 22:45:02 +08:00
暮光:城中城
aeb48e0144 数据预览支持修改查询的sql并执行,优化回车事件 2020-05-11 22:37:30 +08:00
暮光:城中城
713582bebf 增加DDL建表语句展示,优化数据预览,优化卡顿问题 2020-05-08 22:32:54 +08:00
暮光:城中城
0cf04e8466 增加DDL展示,页面展示优化 2020-05-06 21:57:36 +08:00
暮光:城中城
e923156735 表数据查看排序,tab标签页优化 2020-05-04 20:15:18 +08:00
暮光:城中城
7712c52f1b 增加表数据查看功能,tab标签页优化 2020-05-04 12:18:57 +08:00
暮光:城中城
5300348552 标签页以tab形式展示 2020-05-03 09:21:28 +08:00
暮光:城中城
211eafaeed 去掉jta事务管理 2020-04-08 12:17:15 +08:00
暮光:城中城
d87d4a7f70 update README.md. 2020-03-15 14:09:40 +08:00
暮光:城中城
c8923a7cf2 update README.md. 2020-02-29 12:51:23 +08:00
暮光:城中城
8987cca924 老板们放心使用,一直维护中,够我使用了还找不到优化点了 2020-02-22 14:26:05 +08:00
暮光:城中城
6b54a87470 #I17PPP 导出数据库表增加excel格式导出 2020-01-02 22:37:38 +08:00
暮光:城中城
5300ad8d12 #I17OXH 数据库文档,展示表名时改为 表名+表注释 2020-01-02 21:54:56 +08:00
暮光:城中城
f57de18d55 默认值优化,文档优化 2019-11-18 21:48:06 +08:00
暮光:城中城
1537a67a50 swagger展示全部时不展示禁用的 2019-10-27 11:39:12 +08:00
暮光:城中城
53eee3a956 es查询框优化 2019-10-27 11:27:43 +08:00
暮光:城中城
d7c94d0149 数据互导逻辑开发 2019-10-06 21:57:20 +08:00
暮光:城中城
aebc6d2d8b 数据互导功能开发 2019-10-06 18:19:27 +08:00
暮光:城中城
9b4decf68a 数据互导逻辑开发 2019-09-29 23:19:33 +08:00
暮光:城中城
85bad69784 数据库文档oracle支持优化,数据互导雏形 2019-09-29 22:05:35 +08:00
暮光:城中城
9c00186f88 数据库文档增加oracle支持,前端交互优化 2019-09-28 15:25:52 +08:00
暮光:城中城
f69cf40c7a 包优化,数据库文档增加oracle支持 2019-09-28 10:20:20 +08:00
暮光:城中城
7f15b7e23e swagger文档支持禁用和启用 2019-09-20 20:53:24 +08:00
暮光:城中城
93e6575a18 V1.0.4 版本升级 2019-09-10 22:41:59 +08:00
暮光:城中城
c4ccaa20ca 数据库表信息状态展示 2019-09-04 22:41:44 +08:00
暮光:城中城
abc24b424f 执行器库表信息查询修改,展示优化,增加快捷键执行 2019-09-02 22:47:24 +08:00
暮光:城中城
9c29f4c8fd 前端打包 2019-09-01 18:54:56 +08:00
暮光:城中城
6f38aed1ae 执行器查询展示增加多窗口展示 2019-09-01 18:41:17 +08:00
暮光:城中城
38e1f28305 执行历史关联数据源,执行时长和影响条数展示 2019-08-28 22:19:12 +08:00
暮光:城中城
04f36bf3ad 动态计算展示宽度 2019-08-27 23:21:58 +08:00
暮光:城中城
63f6b80b79 缓存优化,执行器查询展示优化 2019-08-27 22:53:41 +08:00
暮光:城中城
cbaee753cb swagger增加自定义名字展示 2019-08-25 22:43:14 +08:00
暮光:城中城
607a97b51b sql执行器支持库表字段的智能提示 2019-08-24 23:13:43 +08:00
暮光:城中城
6c2141e8b8 数据源初始化优化,权限优化 2019-08-24 10:01:13 +08:00
暮光:城中城
f5e45b776b sql执行器开发 2019-08-22 22:32:18 +08:00
暮光:城中城
ec9674441f sql执行器开发,增加权限 2019-08-22 22:21:49 +08:00
暮光:城中城
48e4a73ea9 sql执行器开发 2019-08-21 23:26:03 +08:00
暮光:城中城
76b18edc87 sql执行器开发 2019-08-21 23:18:59 +08:00
暮光:城中城
1f7cd7ad6c sql执行器开发 2019-08-21 23:17:04 +08:00
暮光:城中城
f0920be5a5 数据库文档增加执行sql功能 2019-08-21 20:39:43 +08:00
暮光:城中城
b62b521129 1.0.3版本升级 2019-08-17 22:07:25 +08:00
暮光:城中城
7f9e2c790b 1.0.3版本升级 2019-08-17 22:02:45 +08:00
暮光:城中城
93f859bcbe 修改swagger内容初始化 2019-08-17 21:49:59 +08:00
暮光:城中城
4d6b09d640 版本升级1.0.3,swagger文档优化 2019-08-17 21:16:32 +08:00
暮光:城中城
2c11dbdcf0 数据库和swagger优化 2019-08-13 22:52:24 +08:00
暮光:城中城
26b700fde3 swagger支持json文档录入 2019-08-12 20:44:17 +08:00
暮光:城中城
f9173925ab 数据库表导出,支持修改用户密码 2019-08-11 23:13:13 +08:00
暮光:城中城
883540488b es文档界面打包 2019-08-11 16:14:01 +08:00
暮光:城中城
fadf52cec8 es功能开发,基本可用了 2019-07-27 22:58:16 +08:00
暮光:城中城
116e04e3bf es功能开发 2019-07-27 00:47:46 +08:00
暮光:城中城
9d7149aa04 es文档开发 2019-07-26 23:48:48 +08:00
暮光:城中城
fc02414519 es文档开发 2019-07-23 21:41:20 +08:00
暮光:城中城
417132d25c 数据库文档优化 2019-07-23 21:39:57 +08:00
暮光:城中城
fb5438e1ec 增加es文档雏形~ 2019-07-21 22:41:23 +08:00
暮光:城中城
25036fb197 默认关闭es 2019-07-18 23:25:45 +08:00
暮光:城中城
5084b4ce6a 项目整合,增加测试项目,es改为rest客户端接口查询 2019-07-18 23:21:07 +08:00
暮光:城中城
bf2bf47f53 优化es,去掉评论权 2019-07-16 22:33:42 +08:00
暮光:城中城
cfb954854f wiki编辑展示优化 2019-07-15 23:08:06 +08:00
暮光:城中城
f03c8a03ac es搜索优化 2019-07-12 21:46:05 +08:00
暮光:城中城
7aa1108270 去掉不需要的字段 2019-07-11 23:41:51 +08:00
暮光:城中城
a081443c91 增加了elasticsearch全局搜索和文章内搜索 2019-07-11 23:36:30 +08:00
暮光:城中城
9a50db6b5d es数据查询优化 2019-07-10 22:38:36 +08:00
暮光:城中城
02a56bc6b5 增加elasticsearch 2019-07-10 21:19:06 +08:00
暮光:城中城
1b706019cd 数据库问文档重构优化 2019-07-05 22:40:40 +08:00
暮光:城中城
67c6ffc877 数据库文档重构,细节修改 2019-07-04 23:39:55 +08:00
暮光:城中城
6c1f4e123a 数据库问文档重构 2019-07-04 21:52:39 +08:00
暮光:城中城
e3ed105f49 swagger支持填入页面地址 2019-07-03 22:51:53 +08:00
暮光:城中城
0214934b1f nacos改为通过它后端接口获取服务列表 2019-07-02 23:50:31 +08:00
暮光:城中城
dc4d1e1c65 修改项目名 2019-07-02 23:31:17 +08:00
暮光:城中城
a147d389da 修改版本号 2019-06-30 21:54:38 +08:00
暮光:城中城
95ffa30c12 Merge remote-tracking branch 'origin/master' 2019-06-30 21:53:47 +08:00
暮光:城中城
17c123003f 修改版本号 2019-06-30 21:53:36 +08:00
暮光:城中城
817ae4d3fc 更新 README.md 2019-06-30 15:46:33 +08:00
暮光:城中城
0a31c4ee4b 文档优化 2019-06-30 15:41:31 +08:00
暮光:城中城
1babdb56ec 引包优化 2019-06-30 15:14:58 +08:00
暮光:城中城
4096def6b3 版本升级 2019-06-30 11:03:27 +08:00
暮光:城中城
440123aed2 版本升级 2019-06-30 10:59:39 +08:00
暮光:城中城
bdc8e7a959 调试优化 2019-06-30 10:46:23 +08:00
暮光:城中城
242ca36a7a 首页新版开发跳转 2019-06-29 23:49:20 +08:00
暮光:城中城
49c1929746 用户管理页面开发 2019-06-28 23:23:51 +08:00
暮光:城中城
9d6ab9e159 登录和首页优化 2019-06-28 22:03:52 +08:00
暮光:城中城
eb7112b956 错误优化 2019-06-27 22:56:40 +08:00
暮光:城中城
f144e77035 重构控制台首页 2019-06-27 22:42:06 +08:00
暮光:城中城
968bbb5f5a 修改swagger请求文档超时时间 2019-06-25 22:14:21 +08:00
暮光:城中城
65dd754580 修改swagger后端请求文档时带上全局参数 2019-06-25 21:47:51 +08:00
暮光:城中城
1f57b0d478 修改swagger后端请求文档时带上全局参数 2019-06-25 21:38:34 +08:00
暮光:城中城
23d4dc5ec3 权限判断 2019-06-25 12:38:21 +08:00
暮光:城中城
031ea4f199 去掉不需要的字段 2019-06-25 12:17:32 +08:00
暮光:城中城
29586f35d7 修改swagger解析报错,白名单域名默认为不限制 2019-06-24 22:43:21 +08:00
暮光:城中城
f83c27882f 修改readme 2019-06-21 21:39:09 +08:00
暮光:城中城
fbd6ef5f83 同一个页面只能一个人编辑 2019-06-21 21:05:34 +08:00
暮光:城中城
89b32304bd 空间编辑权判断 2019-06-18 22:56:51 +08:00
暮光:城中城
0f9f909d73 文件权限控制,展示下载数 2019-06-18 22:38:46 +08:00
暮光:城中城
994ced47bc 增加下载数,页面跳转、展示优化 2019-06-18 20:32:37 +08:00
暮光:城中城
40f594f1ff 开放文档排序和增加阅读数 2019-06-15 15:57:03 +08:00
暮光:城中城
8a94b6e426 wiki页面打包 2019-06-15 13:47:53 +08:00
暮光:城中城
f975e23cd8 删除页面时递归删除子页面 2019-06-15 13:13:22 +08:00
暮光:城中城
dc93ea4395 统一返回值编码 2019-06-15 10:38:57 +08:00
暮光:城中城
c1adc111a1 文档前端打包 2019-06-14 22:24:45 +08:00
暮光:城中城
5fffa51171 文档前端打包 2019-06-14 21:15:29 +08:00
暮光:城中城
a61b100768 空间首页增加列表查询,编辑查看优化 2019-06-14 20:46:53 +08:00
暮光:城中城
494149fad2 增加权限和登录跳转 2019-06-12 22:28:38 +08:00
暮光:城中城
f9d53da7fe 增加拖动改变文章顺序 2019-06-10 21:15:56 +08:00
暮光:城中城
605c97347d 权限开发,页面交互开发,增加阅读数 2019-06-05 22:53:24 +08:00
暮光:城中城
96d081fdae 文档展示和编辑,基本功能已完成 2019-06-02 22:38:36 +08:00
暮光:城中城
49189587ce 文档展示和编辑 2019-06-01 23:03:10 +08:00
暮光:城中城
48f81dc547 权限优化 2019-06-01 09:36:55 +08:00
暮光:城中城
7f4f3fd432 左侧菜单和页面内容展示 2019-05-30 22:45:22 +08:00
暮光:城中城
f5249f39e1 登录和权限处理,页面优化 2019-05-30 20:39:15 +08:00
暮光:城中城
c3b3b60d93 自己写一套权限控制,去掉spring security 2019-05-29 23:03:30 +08:00
暮光:城中城
25b4089a8f 前端拆分为单独项目来维护开发 2019-05-17 18:23:03 +08:00
暮光:城中城
13e390535d 设置dubbo超时时间 2019-04-26 18:16:01 +08:00
暮光:城中城
d406b52d6a wiki图片权限判断 2019-04-21 23:37:56 +08:00
暮光:城中城
aaa267a6c4 wiki支持粘贴图片 2019-04-21 18:13:33 +08:00
暮光:城中城
98e4f771f0 wiki文档优化 2019-04-21 17:38:33 +08:00
暮光:城中城
7c8ab60c6d wiki文档优化,系统升级信息获取和展示 2019-04-21 16:46:14 +08:00
暮光:城中城
ad739a87e0 修改数据格式 2019-04-11 20:08:22 +08:00
暮光:城中城
3bb18069ad 登录失效提示 2019-04-11 20:08:05 +08:00
暮光:城中城
a6c1360593 grpc优化 2019-04-05 21:55:18 +08:00
暮光:城中城
0e0f512571 取消grpc默认开启 2019-04-03 00:07:20 +08:00
暮光:城中城
0606099b2a Merge branch 'grpc'
# Conflicts:
#	zyplayer-doc-grpc/src/main/java/com/zyplayer/doc/grpc/framework/config/EnableDocGrpc.java
#	zyplayer-doc-grpc/src/main/resources/doc-grpc.html
#	zyplayer-doc-manage/src/main/java/com/zyplayer/doc/manage/framework/config/DocDatabaseRegistrationConfig.java
#	zyplayer-doc-manage/src/main/java/com/zyplayer/doc/manage/framework/config/DocDubboConfig.java
#	zyplayer-doc-manage/src/main/java/com/zyplayer/doc/manage/framework/config/DocWikiConfig.java
#	zyplayer-doc-manage/src/main/java/com/zyplayer/doc/manage/framework/config/SwaggerConfiguration.java
#	zyplayer-doc-manage/src/main/java/com/zyplayer/doc/manage/framework/config/ZyplayerDocConfig.java
2019-04-02 20:32:08 +08:00
暮光:城中城
6196238867 grpc开发 2019-04-02 20:31:25 +08:00
暮光:城中城
7caebe9eaf 注解优化,grpc开发 2019-04-02 20:22:18 +08:00
暮光:城中城
165d282beb grpc文档开发 2019-04-01 23:04:48 +08:00
暮光:城中城
4b1c234384 grpc开发 2019-04-01 22:01:02 +08:00
暮光:城中城
5cf08506ef grpc文档开发 2019-03-31 22:59:55 +08:00
暮光:城中城
e518957f16 grpc文档开发 2019-03-30 20:50:55 +08:00
暮光:城中城
f5e6a5998d 文件类型获取修改 2019-03-22 20:15:43 +08:00
暮光:城中城
ff91320ec8 增加grpc文档支持 2019-03-22 19:01:27 +08:00
暮光:城中城
b498a513dc wiki增加开放访问 2019-03-22 03:45:06 +08:00
暮光:城中城
42ed560750 wiki权限判断 2019-03-13 22:34:15 +08:00
暮光:城中城
5096d242fd wiki增加开放访问 2019-03-13 21:30:27 +08:00
暮光:城中城
b037af447f wiki优化 2019-03-12 22:11:10 +08:00
暮光:城中城
7bf66f3916 wiki目录预先加载 2019-03-11 23:22:57 +08:00
暮光:城中城
90ce37ec35 建库脚本 2019-03-09 23:32:36 +08:00
暮光:城中城
2cb6e39eb5 wiki文档优化,增加不可编辑实现 2019-03-09 23:30:33 +08:00
暮光:城中城
5ca5feb9e8 wiki文档优化,增加不可编辑实现 2019-03-09 22:23:30 +08:00
暮光:城中城
840f6b457b wiki空间管理,页面支持拖动管理 2019-03-08 22:40:50 +08:00
暮光:城中城
05142096f7 wiki评论和空间 2019-03-08 21:40:20 +08:00
暮光:城中城
5f7177848b wiki空间相关开发 2019-03-07 22:55:12 +08:00
暮光:城中城
73a88fb7d1 wiki评论和空间 2019-03-07 20:53:13 +08:00
暮光:城中城
c37586d596 wiki功能开发 2019-03-06 23:39:38 +08:00
暮光:城中城
3c29cac2d7 wiki评论点赞 2019-03-06 22:17:57 +08:00
暮光:城中城
7d8fa1ff82 wiki优化 2019-03-05 23:15:47 +08:00
暮光:城中城
7357058694 dubbo优化,wiki上传文件 2019-03-04 23:20:40 +08:00
暮光:城中城
6f30ef0f49 dubbo优化 2019-03-01 22:27:17 +08:00
暮光:城中城
ed8242535d wiki接口和页面 2019-02-28 22:38:56 +08:00
暮光:城中城
b14e2c5989 wiki接口 2019-02-27 21:38:25 +08:00
暮光:城中城
b930103058 框架拆分 2019-02-27 00:04:45 +08:00
暮光:城中城
c995d3a600 框架拆分 2019-02-26 23:04:24 +08:00
暮光:城中城
81435c790a 引用修改 2019-02-25 12:31:54 +08:00
暮光:城中城
aba46ff3d5 Merge remote-tracking branch 'origin/master' 2019-02-25 12:26:27 +08:00
暮光:城中城
e5f4499fa3 #IRYN4 修改参数拼接无效问题 2019-02-25 12:26:16 +08:00
暮光:城中城
caf866ded5 增加说明 2019-02-23 22:19:13 +08:00
暮光:城中城
7c3b04462a 引用优化 2019-02-21 22:14:38 +08:00
暮光:城中城
567a50d075 修改登录地址获取 2019-02-20 22:11:38 +08:00
暮光:城中城
c2968dc8d5 说明文档 2019-02-18 21:37:56 +08:00
暮光:城中城
7f78d77235 dubbo参数自动获取 2019-02-18 20:27:50 +08:00
暮光:城中城
1f4008667c 修改引用,增加搜索的位置 2019-02-18 12:18:12 +08:00
暮光:城中城
584afec6d2 Merge remote-tracking branch 'origin/master' 2019-02-17 20:53:20 +08:00
暮光:城中城
be452f68b9 增加wiki模块 2019-02-17 20:20:39 +08:00
暮光:城中城
2b8c190964 更新 README.md 2019-02-16 22:51:42 +08:00
暮光:城中城
b5a08d080c 增加关于页面 2019-02-15 21:23:42 +08:00
暮光:城中城
4d51b48429 dubbo文档操作接口和页面 2019-02-15 20:58:37 +08:00
暮光:城中城
4a7541d7e7 dubbo文档展示优化 2019-02-14 23:00:32 +08:00
暮光:城中城
705308938e 更新 README.md 2019-02-14 22:58:04 +08:00
暮光:城中城
6c936d46b4 dubbo文档操作接口和页面 2019-02-14 22:38:18 +08:00
暮光:城中城
e42ad1b3eb dubbo文档展示优化 2019-02-13 23:06:49 +08:00
暮光:城中城
a01cba771c dubbo文档操作接口和页面 2019-02-13 21:33:33 +08:00
暮光:城中城
62b6a17c21 dubbo文档操作接口和页面 2019-02-13 21:29:09 +08:00
暮光:城中城
cca2effbd2 dubbo文档优化 2019-02-12 22:33:33 +08:00
暮光:城中城
92ca7fcd4e 增加dubbo接口文档 2019-02-12 21:33:41 +08:00
暮光:城中城
619aa2e950 更新 README.md 2019-02-12 12:49:38 +08:00
暮光:城中城
e11629f77f 日志输出修改 2019-02-03 13:27:31 +08:00
暮光:城中城
fb0d78ea7a 按规范修改 2019-02-02 21:52:09 +08:00
暮光:城中城
e96418e346 各种细节打磨优化,增加提示 2019-02-02 21:17:44 +08:00
暮光:城中城
15cfa7e2d1 白名单使用正则匹配 2019-02-01 18:37:55 +08:00
暮光:城中城
620c7d02e8 开放文档逻辑修改,增加开关 2019-01-30 23:10:28 +08:00
暮光:城中城
496bb0d106 增加白名单域名,优化开放文档,优化展示 2019-01-30 22:21:52 +08:00
暮光:城中城
c8ac59e59a 开放文档逻辑修改 2019-01-28 23:12:55 +08:00
暮光:城中城
c2b64d06e4 增加开放文档逻辑,优化文档展示 2019-01-28 22:26:34 +08:00
暮光:城中城
15eecc7ee0 优化文档存储,展示文档选择 2019-01-27 22:32:14 +08:00
暮光:城中城
c32fc3f05d 优化文档存储,展示文档选择 2019-01-27 22:28:35 +08:00
1178 changed files with 256282 additions and 50304 deletions

63
.gitignore vendored Normal file
View File

@@ -0,0 +1,63 @@
tmlog*.lck
dependency-reduced-pom.xml
/dist
######################################################################
# Build Tools
.gradle
/build/
!gradle/wrapper/gradle-wrapper.jar
target/
!.mvn/wrapper/maven-wrapper.jar
######################################################################
# IDE
### STS ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr
### NetBeans ###
nbproject/private/
build/*
nbbuild/
zyplayer-doc-ui/dist/
nbdist/
.nb-gradle/
######################################################################
# Others
*.log
*.xml.versionsBackup
!*/build/*.java
!*/build/*.html
!*/build/*.xml
### VS Code ###
.vscode/
# rebel
rebel.xml
### gradle构建 ###
*.gradle
### office ###
# 忽略office文件打开临时文件 #
[~$]*.*
tmlog.lck

137
README.md
View File

@@ -1,87 +1,100 @@
# zyplayer-doc
# 项目简介
zyplayer-doc是一款适合团队和个人使用的WIKI文档管理工具同时还包含数据库文档、Api接口文档。
#### 项目介绍
定位为所有文档的管理项目swagger文档、数据库文档....等,提供一整套的解决方案,欢迎有想法的一起来写
体验地址:[http://zyplayer.com](http://zyplayer.com)
#### 软件架构
##### 一、zyplayer-doc-core 一些核心、公用的类
在线文档:[http://doc.zyplayer.com](http://doc.zyplayer.com)
##### 二、zyplayer-doc-db 数据库文档
> 原[zyplayer-doc-db](https://gitee.com/zyplayer/zyplayer-doc-db),具有数据库文档的查看、管理、导出等功能
欢迎有想法的同学一起来完善如果觉得不错就给个Star鼓励下呗作为给项目快速更新的动力
##### 三、zyplayer-doc-manage 可以单独部署的文档管理后台
> 后端使用spring-boot、mybatis-plus、springfox-swagger等框架前端使用[zui](http://zui.sexy/)、[Vue](https://cn.vuejs.org/)等框架
欢迎加入微信群与我们一起交流
> 微信群员超过限制只能加好友拉进群,添加微信好友,回复:`加群` 即可
> 已集成三套优秀swagger文档前端[zyplayer-doc-swagger](https://gitee.com/zyplayer/zyplayer-doc)、[swagger-bootstrap-ui](https://gitee.com/xiaoym/swagger-bootstrap-ui)、[springfox-swagger-ui](https://github.com/springfox/springfox/tree/master/springfox-swagger-ui)
![weixinqun.jpg](https://zyplayer.oss-cn-beijing.aliyuncs.com/doc/weixin/weixinqun.png)
> 已集成[zyplayer-doc-db](https://gitee.com/zyplayer/zyplayer-doc)数据库文档
# 快速启动
## 相关依赖
启动本系统仅依赖JAVA和MySQL
- JAVA 1.8+
- MySQL 5.7.x
##### 四、zyplayer-doc-swagger 原[swagger-mg-ui](https://gitee.com/zyplayer/swagger-mg-ui)swagger的UI及整套解决方案
> 具有 后端存储、代理请求、模拟返回、所有文档管理 等一系列原创功能不止UI
建表SQL脚本无需手动执行每次启动或更新之后都会检查当前版本然后自动执行升级SQL脚本所以每次有版本更新需求只需要下载最新版本启动即可无需其他特殊操作
#### 运行方式
## Main方法启动
1. 修改`zyplayer-doc/zyplayer-doc-manage/src/main/resources/application.yml`配置文件里面的数据库账号密码
2. 执行`com.zyplayer.doc.manage.Application.main`方法启动项目
1. 创建数据库zyplayer_doc_manage执行脚本[zyplayer_doc_manage.sql](https://gitee.com/zyplayer/zyplayer-doc/blob/master/zyplayer-doc-manage/src/main/resources/sql/zyplayer_doc_manage.sql)
## JAR方式启动
1. 直接下载直接下载编译好的jar打包文件编译后的最新版可到[在线文档](http://doc.zyplayer.com)右上角去下载
2. 自行编译:也可以自己动手编译,双击执行:`zyplayer-doc\build.bat`将使用maven编译整个项目为可执行的jar文件编译结果文件放在`zyplayer-doc\dist\version`文件夹下
3. 修改第一步或第二步结果文件夹下的`application.yml`文件里面数据库帐号密码
4. 双击第一步或第二步结果文件夹下的`startup.bat`启动项目
2. 修改zyplayer-doc-manage项目的application.yml配置文件里面的数据库账号密码
## Tomcat容器启动
1. 直接下载编译好的war打包文件编译后的最新版可到[在线文档](http://doc.zyplayer.com)右上角去下载
2. 修改配置文件:`zyplayer-doc.zip\apache-tomcat\webapps\zyplayer-doc\WEB-INF\classes\application.yml`配置文件里面的数据库账号密码
3. 双击`tomcat\bin\startup.bat`启动即可
3. 启动zyplayer-doc-manage项目访问地址
http://127.0.0.1:8082/zyplayer-doc-manage/statics/manage/home.html
未登录会进入登录页面登陆后自动跳回默认账号zyplayer 密码:123456
> 项目页面全是静态的html如果使用idea启动有可能访问不了静态页面需要在这里配置下工作目录然后重新启动即可
![](https://images.gitee.com/uploads/images/2019/0125/094619_7f8963bf_596905.png "配置工作目录")
启动后访问:[http://127.0.0.1:8083/zyplayer-doc](http://127.0.0.1:8083/zyplayer-doc) ,默认登录账号: **zyplayer** 密码: **123456**
#### 功能介绍
# 各模块介绍
## zyplayer-doc-manage 文档管理后台
1. 具有项目模块导航,人员及权限管理功能,分组管理等功能。
2. 集成了本项目内的各个子模块功能,是各模块的协调管理模块。
##### 一、zyplayer-doc-swagger
1. `zyplayer-doc-swagger`->`文档管理`->`文档地址管理` 页可以管理`任意地址`的文档在集成的三套UI中都可以直接查看和调试这里配置的文档不用对UI做任何调整只要标准的UI集成进来也可以直接用
## zyplayer-doc-wiki wiki文档工具
1.线管理公司、项目及任意形式的文档
2. 文档支持按空间划分,按人员分组授权,支持空间收藏和空间内的文档开放访问。
3. 文档支持编辑、查看、评论、上传附件、历史版本查看、页面权限控制、文档搜索等功能。
4. 文档编辑支持html富文本方式编辑和markdown的方式编辑。
5. 本工具使用的开源工具有vue、element-ui、mavon-editor、wangeditor等。
6. 参考学习了Atlassian Confluence文档工具进行开发争取作为该软件的开源免费替代产品同时作为内部文档管理工具最好的存在。
2. 文档展示配置,`自动填充请求参数`:可配置填充级别,`强制重写域名`:文档在本地想调试线上接口的好帮手,`自动保存请求参数`:不用每次输入
## zyplayer-doc-db 数据库工具
一款在线管理数据库的工具,你可以将所有的数据源统一管理到这里面,团队间的各成员就不必每人在自己电脑上装一个数据库管理软件,
然后再添加数据源,可以统一修改数据库账号密码而不用群广播通知,新员工进入后对他使用到的数据源进行授权即可使用。
3. 可配置`全局参数`放在header或param里的
1. 支持MySQL、DorisMySQL协议、SQLServer、Oracle、达梦、PostgreSQL、Hive、Impala数据源。
2. 支持数据库表、字段文档查看修改表文档导出、建表语句DDL导出、表数据导出。
3. 支持SQL执行、表数据预览、不同数据库之间的数据互导支持多数据源管理。
4. 支持按人员、按数据源对用户授权,可给用户 库表注释查看、注释修改、SQL执行、函数修改等粒度的授权。
5. 支持库函数和存储过程的增删改查,修改记录查询等。
6. 目标是取代Navicat做一个小而精的开源免费的在线数据库管理工具。
4. 可对`调试数据`进行管理
## zyplayer-doc-api API接口文档管理工具
一款支持统一管理Swagger文档、OpenApi文档、自建接口文档的管理工具具有文档查看、接口请求、全局参数管理等功能设计走心前端代码使用最新技术构建每一行代码都是全新手动敲出来的超级简单明了代码简洁美观可读性好、易维护。
5. `模拟返回`:前端自行调试接口的好帮手
1. 支持Swagger的文档展示接口调试解析速度快界面设计走心。
2. 支持将所有的Swagger文档、OpenApi文档、自建接口文档进行统一管理支持全局参数设置请求参数缓存下次自动填充等。
3. 目标是实现一个平台解决所有项目的接口文档统一管理。
6. 私人强迫症级定制化文档展示,清晰明了,参数支持批量编辑,每一条线的间距都考量了半天,支持`文件上传`的调试需要指定dataType = `File``MultipartFile`,例:
## 其他
1. zyplayer-doc-ui 前面各模块的前端UI源码
2. zyplayer-doc-core 一些核心、公用的类
3. zyplayer-doc-data 数据库层面的交互
5. zyplayer-doc-other 一些测试
@ApiImplicitParam(name = "file", value = "文件", dataType = "File", allowMultiple = true)
# 用爱发电
如果您正在使用这个项目并感觉良好,或者是想支持项目继续开发,您可以通过如下`任意`方式支持我们:
1. Star并分享 [zyplayer-doc](https://gitee.com/zyplayer/zyplayer-doc)
2. 保留`关于页面`的项目链接
3. 你也可以选择使用 [商业版](https://doc.zyplayer.com/#/integrate/zyplayer-doc/commercial) 来支持我们
7. 后端代理请求,后端存储,不会存在任何跨域问题
# 界面展示
控制台页面
![主页面](https://images.gitee.com/uploads/images/2020/0516/125840_d6284954_596905.png "主页面.png")
##### 二、zyplayer-doc-db
1. 支持Mysql、SQLserver的数据库表、字段文档查看修改导出展示关系图等功能
2. 支持多数据源,在`zyplayer-doc-manage` -> `application.yml` -> `zyplayer.doc.db.dbConfigList` 处配置多个数据库连接即可
##### 三、zyplayer-doc-manage
1. 整合了上面两个功能到此项目,较少熟悉成本,`git clone`下来即可运行
2. 具有简单的`权限管理``人员管理`功能(还没想好具体怎么控制,没需求)
3. 使用最新的一些技术框架,很简单,初学者拿来学习也是很不错的
#### 界面展示
权限和用户管理:
![](https://images.gitee.com/uploads/images/2018/1216/224050_3f93dd4a_596905.png "屏幕截图.png")
数据库文档:
![](https://images.gitee.com/uploads/images/2018/1219/231332_0a95e458_596905.png "屏幕截图.png")
增加文档处:
![](https://images.gitee.com/uploads/images/2019/0108/225208_6f4a9a64_596905.png "屏幕截图.png")
使用springfox-swagger-ui访问增加的文档
![](https://images.gitee.com/uploads/images/2019/0108/225313_76ab6962_596905.png "屏幕截图.png")
文档展示:
![](https://images.gitee.com/uploads/images/2019/0108/224850_6940f92e_596905.png "屏幕截图.png")
在线调试:
![](https://images.gitee.com/uploads/images/2019/0108/224934_cb4cedea_596905.png "屏幕截图.png")
模拟返回:
![](https://images.gitee.com/uploads/images/2019/0108/224958_1f20b45d_596905.png "屏幕截图.png")
文档配置:
![](https://images.gitee.com/uploads/images/2019/0108/225024_1c8b2526_596905.png "屏幕截图.png")
全局参数管理:
![](https://images.gitee.com/uploads/images/2019/0108/225056_d2e861df_596905.png "屏幕截图.png")
数据库文档页面
![数据库文档](https://images.gitee.com/uploads/images/2020/0516/130017_254f9559_596905.png "数据库文档.png")
WIKI文档页面
![wiki文档](https://images.gitee.com/uploads/images/2020/0516/130119_bc2f5021_596905.png "wiki文档.png")
API文档主页面
![主页面](https://images.gitee.com/uploads/images/2021/1120/181101_87903c1f_596905.png "主页面.png")
API文档查看页面
![文档查看页面](https://images.gitee.com/uploads/images/2021/1120/181135_0b6034e4_596905.png "文档查看页面.png")
API文档在线调试页面
![在线调试页面](https://images.gitee.com/uploads/images/2021/1120/181205_462cb4aa_596905.png "在线调试页面.png")

26
build.bat Normal file
View File

@@ -0,0 +1,26 @@
@echo off
set dist_dir=dist
set app_name=zyplayer-doc
set version="1.1.5"
set build_folder=%app_name%-%version%
set target_dir=%dist_dir%\%build_folder%
call mvn clean package -Dmaven.test.skip=true
::copy files
rd /q /s %target_dir%
md %target_dir%
copy zyplayer-doc-manage\target\zyplayer-doc.jar %target_dir%
copy zyplayer-doc-manage\src\main\resources\application.yml %target_dir%
xcopy /e /y /q zyplayer-doc-other\script %target_dir%
pause

30
build.sh Normal file
View File

@@ -0,0 +1,30 @@
#!/bin/sh
dist_dir="dist"
app_name="zyplayer-doc"
version="1.1.5"
build_folder="${app_name}-${version}"
# 输出目录
target_dir="$dist_dir/${build_folder}"
echo "开始构建服务端..."
mvn clean package -Dmaven.test.skip=true
# 复制文件
if [ ! -d "$target_dir" ]; then
mkdir -p $target_dir
fi
rm -rf $target_dir/*
# 复制服务端资源
cp -r zyplayer-doc-manage/target/zyplayer-doc.jar $target_dir
cp -r zyplayer-doc-manage/src/main/resources/application.yml $target_dir
cp -r zyplayer-doc-other/script/* $target_dir
echo "服务端构建完毕,构建结果在${target_dir}文件夹下"

206
pom.xml
View File

@@ -8,45 +8,189 @@
<packaging>pom</packaging>
<name>zyplayer-doc</name>
<description>定位为所有文档的管理项目swagger文档、数据库文档、、、、</description>
<description>定位为所有文档的管理项目swagger文档、数据库文档、WIKI文档</description>
<properties>
<skipTests>true</skipTests>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<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.0.0</zyplayer.doc.version>
<spring.boot.version>2.1.6.RELEASE</spring.boot.version>
</properties>
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.7.0</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>${fastjson.version}</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
<modules>
<module>zyplayer-doc-db</module>
<module>zyplayer-doc-manage</module>
<module>zyplayer-doc-swagger</module>
<module>zyplayer-doc-db</module>
<module>zyplayer-doc-api</module>
<module>zyplayer-doc-wiki</module>
<module>zyplayer-doc-core</module>
</modules>
</project>
<module>zyplayer-doc-data</module>
<module>zyplayer-doc-other</module>
</modules>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot</artifactId>
<version>${spring.boot.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>${spring.boot.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>${spring.boot.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<version>${spring.boot.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
<version>${spring.boot.version}</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.32</version>
</dependency>
<dependency>
<groupId>net.sourceforge.jtds</groupId>
<artifactId>jtds</artifactId>
<version>1.3.1</version>
</dependency>
<!--达梦数据库驱动-->
<dependency>
<groupId>com.dameng</groupId>
<artifactId>DmJdbcDriver18</artifactId>
<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>
<version>42.2.2</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.2</version>
</dependency>
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.4</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>2.12.0</version>
</dependency>
<dependency>
<groupId>commons-collections</groupId>
<artifactId>commons-collections</artifactId>
<version>3.2.2</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.12.0</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>2.1.4</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<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>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.5.1</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<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>
<version>2.5</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.9.2</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.83</version>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.6.6</version>
</dependency>
<dependency>
<groupId>com.zyplayer</groupId>
<artifactId>zyplayer-doc-core</artifactId>
<version>${zyplayer.doc.version}</version>
</dependency>
<dependency>
<groupId>com.zyplayer</groupId>
<artifactId>zyplayer-doc-data</artifactId>
<version>${zyplayer.doc.version}</version>
</dependency>
<dependency>
<groupId>com.zyplayer</groupId>
<artifactId>zyplayer-doc-db</artifactId>
<version>${zyplayer.doc.version}</version>
</dependency>
<dependency>
<groupId>com.zyplayer</groupId>
<artifactId>zyplayer-doc-api</artifactId>
<version>${zyplayer.doc.version}</version>
</dependency>
<dependency>
<groupId>com.zyplayer</groupId>
<artifactId>zyplayer-doc-wiki</artifactId>
<version>${zyplayer.doc.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
</project>

15
upgrade.properties Normal file
View File

@@ -0,0 +1,15 @@
# 本文件用于已部署好的系统检测自己是否需要升级使用,怕有人担心安全一类的问题,所以不提供服务器接口来做
lastVersion=1.1.6
upgradeContent=1. 优化WIKI文档展示\
2. #I6S5YA 解决路由错误问题;\
3. #I6Z8UX 解决表格样式问题;\
4. #I6Z8UX 解决列表样式问题,修复保存后文档加载问题;\
5. 升级fastjson版本\
6. 修复图片查看问题;\
7. 移除错误的和不需要的依赖;\
8. 修复保存后文档加载问题;
upgradeUrl=https://gitee.com/zyplayer/zyplayer-doc/releases
nextStep=

96
zyplayer-doc-api/pom.xml Normal file
View File

@@ -0,0 +1,96 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<artifactId>zyplayer-doc-api</artifactId>
<packaging>jar</packaging>
<name>zyplayer-doc-api</name>
<description>zyplayer-doc-api是一款接口文档管理系统</description>
<url>https://gitee.com/zyplayer/zyplayer-doc/zyplayer-doc</url>
<developers>
<developer>
<id>zyplayer</id>
<name>暮光:城中城</name>
<email>806783409@qq.com</email>
<roles>
<role>Java Development Engineer</role>
</roles>
<timezone>2018-05-22 16:06:06</timezone>
</developer>
</developers>
<parent>
<groupId>com.zyplayer</groupId>
<artifactId>zyplayer-doc</artifactId>
<version>1.0.0</version>
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<!-- 打包跳过单元测试 -->
<skipTests>true</skipTests>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
</dependency>
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
</dependency>
<dependency>
<groupId>com.zyplayer</groupId>
<artifactId>zyplayer-doc-core</artifactId>
</dependency>
<dependency>
<groupId>com.zyplayer</groupId>
<artifactId>zyplayer-doc-data</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
<licenses>
<license>
<name>The Apache Software License, Version 2.0</name>
<url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
</license>
</licenses>
<scm>
<connection>scm:git@git.oschina.net:zyplayer/zyplayer-doc.git</connection>
<developerConnection>scm:git@git.oschina.net:zyplayer/zyplayer-doc.git</developerConnection>
<url>git@git.oschina.net:zyplayer/zyplayer-doc.git</url>
</scm>
<distributionManagement>
<snapshotRepository>
<id>snapshots</id>
<url>https://oss.sonatype.org/content/repositories/snapshots/</url>
</snapshotRepository>
<repository>
<id>snapshots</id>
<url>https://oss.sonatype.org/service/local/staging/deploy/maven2/</url>
</repository>
</distributionManagement>
<build>
<resources>
<resource>
<directory>src/main/resources/dist</directory>
<targetPath>META-INF/resources/</targetPath>
</resource>
</resources>
</build>
</project>

View File

@@ -0,0 +1,156 @@
package com.zyplayer.doc.api.controller;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.zyplayer.doc.api.controller.vo.ApiCustomParamsVo;
import com.zyplayer.doc.core.annotation.AuthMan;
import com.zyplayer.doc.core.json.DocResponseJson;
import com.zyplayer.doc.core.json.ResponseJson;
import com.zyplayer.doc.data.repository.manage.entity.*;
import com.zyplayer.doc.data.service.common.ApiDocAuthJudgeService;
import com.zyplayer.doc.data.service.manage.ApiCustomNodeService;
import com.zyplayer.doc.data.service.manage.ApiCustomParamsService;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.annotation.Resource;
/**
* <p>
* 自建接口文档分组 前端控制器
* </p>
*
* @author 暮光:城中城
* @since 2021-12-22
*/
@AuthMan
@Controller
@RequestMapping("/api-custom-node")
public class ApiCustomNodeController {
@Resource
ApiCustomNodeService apiCustomNodeService;
@Resource
ApiCustomParamsService apiCustomParamsService;
@Resource
ApiDocAuthJudgeService apiDocAuthJudgeService;
/**
* 1. 新增文件夹
* 2. 修改文件夹名称说明等
* 3. 修改父文件夹
*
* @return 文档内容
* @author 暮光:城中城
* @since 2021年12月22日
*/
@ResponseBody
@PostMapping(value = "/add")
public ResponseJson<Object> add(ApiCustomNode apiCustomNode, ApiCustomParams apiCustomParams) {
apiCustomNodeService.addNode(apiCustomNode, apiCustomParams);
return DocResponseJson.ok(apiCustomNode);
}
/**
* 修改文件夹
*
* @return 文档内容
* @author 暮光:城中城
* @since 2021年12月22日
*/
@ResponseBody
@PostMapping(value = "/update")
public ResponseJson<Object> update(ApiCustomNode apiCustomNode) {
// 参数未传不处理
if (apiCustomNode.getId() == null) {
return DocResponseJson.ok();
}
if (StringUtils.isBlank(apiCustomNode.getNodeName()) && StringUtils.isBlank(apiCustomNode.getNodeDesc())) {
return DocResponseJson.ok();
}
ApiCustomNode apiCustomFolderSel = apiCustomNodeService.getById(apiCustomNode.getId());
apiDocAuthJudgeService.judgeDevelopAndThrow(apiCustomFolderSel.getDocId());
// 执行修改
ApiCustomNode nodeUp = new ApiCustomNode();
nodeUp.setId(apiCustomNode.getId());
nodeUp.setNodeName(apiCustomNode.getNodeName());
nodeUp.setNodeDesc(apiCustomNode.getNodeDesc());
apiCustomNodeService.updateById(nodeUp);
return DocResponseJson.ok();
}
/**
* 删除文件夹
*
* @return 文档内容
* @author 暮光:城中城
* @since 2021年12月22日
*/
@ResponseBody
@PostMapping(value = "/delete")
public ResponseJson<Object> delete(Long id) {
ApiCustomNode apiCustomFolderSel = apiCustomNodeService.getById(id);
apiDocAuthJudgeService.judgeDevelopAndThrow(apiCustomFolderSel.getDocId());
apiCustomNodeService.deleteNode(id);
return DocResponseJson.ok();
}
/**
* 删除文件夹
*
* @return 文档内容
* @author 暮光:城中城
* @since 2021年12月22日
*/
@ResponseBody
@PostMapping(value = "/changeParent")
public ResponseJson<Object> changeParent(Long id, Long parentId, Integer targetType, Integer targetSeq) {
ApiCustomNode apiCustomFolderSel = apiCustomNodeService.getById(id);
apiDocAuthJudgeService.judgeDevelopAndThrow(apiCustomFolderSel.getDocId());
apiCustomNodeService.changeParent(id, parentId, targetType, targetSeq);
return DocResponseJson.ok();
}
/**
* 自定义接口详情
*
* @return 文档内容
* @author 暮光:城中城
* @since 2022年01月05日
*/
@ResponseBody
@PostMapping(value = "/detail")
public ResponseJson<Object> detail(Long id) {
ApiCustomNode apiCustomNode = apiCustomNodeService.getById(id);
if (apiCustomNode == null) {
return DocResponseJson.warn("接口不存在");
}
apiDocAuthJudgeService.judgeDevelopAndThrow(apiCustomNode.getDocId());
QueryWrapper<ApiCustomParams> paramsWrapper = new QueryWrapper<>();
paramsWrapper.eq("yn", 1);
paramsWrapper.eq("node_id", id);
ApiCustomParams apiCustomParams = apiCustomParamsService.getOne(paramsWrapper);
// 组装结果对象
ApiCustomParamsVo customParamsVo = new ApiCustomParamsVo();
customParamsVo.setId(apiCustomNode.getId());
customParamsVo.setDocId(apiCustomNode.getDocId());
customParamsVo.setParentId(apiCustomNode.getParentId());
customParamsVo.setNodeType(apiCustomNode.getNodeType());
customParamsVo.setNodeName(apiCustomNode.getNodeName());
customParamsVo.setNodeDesc(apiCustomNode.getNodeDesc());
customParamsVo.setSeqNo(apiCustomNode.getSeqNo());
customParamsVo.setNodeId(apiCustomNode.getId());
if (apiCustomParams != null) {
customParamsVo.setMethod(apiCustomParams.getMethod());
customParamsVo.setApiUrl(apiCustomParams.getApiUrl());
customParamsVo.setFormData(apiCustomParams.getFormData());
customParamsVo.setBodyData(apiCustomParams.getBodyData());
customParamsVo.setHeaderData(apiCustomParams.getHeaderData());
customParamsVo.setCookieData(apiCustomParams.getCookieData());
}
return DocResponseJson.ok(customParamsVo);
}
}

View File

@@ -0,0 +1,130 @@
package com.zyplayer.doc.api.controller;
import com.zyplayer.doc.api.controller.vo.DocUserAuthVo;
import com.zyplayer.doc.core.annotation.AuthMan;
import com.zyplayer.doc.core.json.DocResponseJson;
import com.zyplayer.doc.core.json.ResponseJson;
import com.zyplayer.doc.data.config.security.DocUserDetails;
import com.zyplayer.doc.data.config.security.DocUserUtil;
import com.zyplayer.doc.data.repository.manage.entity.*;
import com.zyplayer.doc.data.repository.support.consts.ApiAuthType;
import com.zyplayer.doc.data.repository.support.consts.DocSysModuleType;
import com.zyplayer.doc.data.repository.support.consts.DocSysType;
import com.zyplayer.doc.data.service.common.ApiDocAuthJudgeService;
import com.zyplayer.doc.data.service.manage.ApiDocService;
import com.zyplayer.doc.data.service.manage.AuthInfoService;
import com.zyplayer.doc.data.service.manage.UserAuthService;
import com.zyplayer.doc.data.service.manage.UserInfoService;
import org.apache.commons.collections.CollectionUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import java.util.*;
import java.util.stream.Collectors;
/**
* api权限控制器
*
* @author 暮光:城中城
* @since 2021年12月12日
*/
@AuthMan
@RestController
@RequestMapping("/doc-api/doc/auth")
public class ApiDocAuthController {
private static Logger logger = LoggerFactory.getLogger(ApiDocAuthController.class);
@Resource
UserAuthService userAuthService;
@Resource
AuthInfoService authInfoService;
@Resource
UserInfoService userInfoService;
@Resource
ApiDocService apiDocService;
@Resource
ApiDocAuthJudgeService apiDocAuthJudgeService;
@PostMapping("/list")
public ResponseJson<Object> list(Long docId) {
if (!apiDocAuthJudgeService.haveManageAuth(docId)) {
return DocResponseJson.warn("没有此文档的操作权限");
}
List<UserAuth> authList = userAuthService.getModuleAuthList(DocSysType.API.getType(), DocSysModuleType.Api.DOC.getType(), docId);
if (CollectionUtils.isEmpty(authList)) {
return DocResponseJson.ok();
}
// 权限ID对应的权限名
Collection<AuthInfo> authInfoList = authInfoService.listByIds(authList.stream().map(UserAuth::getAuthId).collect(Collectors.toSet()));
Map<Long, String> authInfoMap = authInfoList.stream().collect(Collectors.toMap(AuthInfo::getId, AuthInfo::getAuthName));
Collection<UserInfo> userInfoList = userInfoService.listByIds(authList.stream().map(UserAuth::getUserId).collect(Collectors.toSet()));
Map<Long, UserInfo> userInfoMap = userInfoList.stream().collect(Collectors.toMap(UserInfo::getId, val -> val));
// 返回结果组装
List<DocUserAuthVo> authVoList = new LinkedList<>();
for (UserAuth userAuth : authList) {
UserInfo userInfo = userInfoMap.get(userAuth.getUserId());
String authCode = authInfoMap.get(userAuth.getAuthId());
DocUserAuthVo authVo = new DocUserAuthVo();
authVo.setAuthType(ApiAuthType.typeOf(authCode).getType());
authVo.setUserId(userAuth.getUserId());
authVo.setUserNo(userInfo.getUserNo());
authVo.setUserName(userInfo.getUserName());
authVo.setEmail(userInfo.getEmail());
authVo.setPhone(userInfo.getPhone());
authVo.setSex(userInfo.getSex());
authVoList.add(authVo);
}
return DocResponseJson.ok(authVoList);
}
@PostMapping("/assign")
public ResponseJson<Object> assign(Long docId, Long userId, Integer authType) {
if (!apiDocAuthJudgeService.haveManageAuth(docId)) {
return DocResponseJson.warn("没有此文档的操作权限");
}
DocUserDetails currentUser = DocUserUtil.getCurrentUser();
String authCode = ApiAuthType.typeOf(authType).getCode();
AuthInfo authInfo = authInfoService.getByCode(authCode);
List<UserAuth> userModuleAuthList = userAuthService.getUserModuleAuthList(userId, DocSysType.API.getType(), DocSysModuleType.Api.DOC.getType(), docId);
if (CollectionUtils.isNotEmpty(userModuleAuthList)) {
UserAuth userAuth = userModuleAuthList.remove(0);
// 错误数据兼容移除
if (userModuleAuthList.size() > 0) {
List<Long> authIdList = userModuleAuthList.stream().map(UserAuth::getId).collect(Collectors.toList());
userAuthService.removeByIds(authIdList);
}
userAuth.setAuthId(authInfo.getId());
userAuth.setUpdateTime(new Date());
userAuth.setUpdateUid(currentUser.getUserId());
userAuthService.updateById(userAuth);
} else {
UserAuth userAuth = new UserAuth();
userAuth.setUserId(userId);
userAuth.setSysType(DocSysType.API.getType());
userAuth.setSysModuleType(DocSysModuleType.Api.DOC.getType());
userAuth.setSysModuleId(docId);
userAuth.setAuthId(authInfo.getId());
userAuth.setCreationTime(new Date());
userAuth.setCreateUid(currentUser.getUserId());
userAuth.setUpdateTime(new Date());
userAuth.setUpdateUid(currentUser.getUserId());
userAuth.setDelFlag(0);
userAuthService.save(userAuth);
}
return DocResponseJson.ok();
}
@PostMapping("/delete")
public ResponseJson<Object> delete(Long docId, Long userId) {
if (!apiDocAuthJudgeService.haveManageAuth(docId)) {
return DocResponseJson.warn("没有此文档的操作权限");
}
userAuthService.deleteUserModuleAuth(userId, DocSysType.API.getType(), DocSysModuleType.Api.DOC.getType(), docId);
return DocResponseJson.ok();
}
}

View File

@@ -0,0 +1,230 @@
package com.zyplayer.doc.api.controller;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.IdUtil;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.zyplayer.doc.api.framework.utils.SwaggerDocUtil;
import com.zyplayer.doc.api.service.SwaggerHttpRequestService;
import com.zyplayer.doc.core.annotation.AuthMan;
import com.zyplayer.doc.core.json.DocResponseJson;
import com.zyplayer.doc.core.json.ResponseJson;
import com.zyplayer.doc.data.config.security.DocUserDetails;
import com.zyplayer.doc.data.config.security.DocUserUtil;
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.ApiDocVo;
import com.zyplayer.doc.data.repository.support.consts.ApiAuthType;
import com.zyplayer.doc.data.service.common.ApiDocAuthJudgeService;
import com.zyplayer.doc.data.service.manage.ApiCustomNodeService;
import com.zyplayer.doc.data.service.manage.ApiDocService;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import springfox.documentation.swagger.web.SwaggerResource;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.util.Date;
import java.util.List;
import java.util.Objects;
/**
* 文档控制器
*
* @author 暮光:城中城
* @since 2021年10月16日
*/
@AuthMan
@RestController
@RequestMapping("/doc-api/doc")
public class ApiDocumentController {
private static Logger logger = LoggerFactory.getLogger(ApiDocumentController.class);
@Resource
ApiDocAuthJudgeService apiDocAuthJudgeService;
@Resource
private ApiDocService apiDocService;
@Resource
private SwaggerHttpRequestService swaggerHttpRequestService;
@Resource
ApiCustomNodeService apiCustomNodeService;
/**
* 获取所有的文档地址
*
* @return 文档内容
* @author 暮光:城中城
* @since 2021年10月16日
*/
@ResponseBody
@PostMapping(value = "/list")
public ResponseJson<List<ApiDocVo>> list(ApiDoc apiDoc, Integer pageNum, Integer pageSize) {
IPage<ApiDocVo> docList = apiDocService.getApiDocList(apiDoc, pageNum, pageSize);
return DocResponseJson.ok(docList);
}
/**
* 获取文档内容
*
* @return 文档内容
* @author 暮光:城中城
* @since 2021年10月16日
*/
@ResponseBody
@PostMapping(value = "/detail")
public ResponseJson<List<ApiDoc>> detail(Long id) {
ApiDoc apiDoc = apiDocService.getById(id);
if (!apiDocAuthJudgeService.haveDevelopAuth(apiDoc)) {
return DocResponseJson.warn("没有此文档的查看权限");
}
ApiDocVo apiDocVo = new ApiDocVo();
BeanUtil.copyProperties(apiDoc, apiDocVo);
Integer authType = apiDocAuthJudgeService.haveManageAuth(apiDoc) ? ApiAuthType.MANAGE.getType() : ApiAuthType.DEVELOPER.getType();
apiDocVo.setAuthType(authType);
return DocResponseJson.ok(apiDocVo);
}
/**
* 添加文档
*
* @return 文档内容
* @author 暮光:城中城
* @since 2021年10月16日
*/
@ResponseBody
@PostMapping(value = "/add")
public ResponseJson<Object> add(HttpServletRequest request, ApiDoc apiDoc) {
DocUserDetails currentUser = DocUserUtil.getCurrentUser();
apiDoc.setYn(1);
apiDoc.setCreateTime(new Date());
apiDoc.setCreateUserId(currentUser.getUserId());
apiDoc.setCreateUserName(currentUser.getUsername());
if (apiDoc.getId() == null) {
apiDoc.setShareUuid(IdUtil.simpleUUID());
} else {
ApiDoc apiDocSel = apiDocService.getById(apiDoc.getId());
if (apiDocSel == null) {
return DocResponseJson.warn("未找到指定的文档记录信息");
}
if (!apiDocAuthJudgeService.haveManageAuth(apiDocSel)) {
return DocResponseJson.warn("没有此文档的操作权限");
}
if (StringUtils.isBlank(apiDocSel.getShareUuid())) {
apiDoc.setShareUuid(IdUtil.simpleUUID());
}
}
// url类型
if (Objects.equals(apiDoc.getDocType(), 1)) {
// UI地址替换为文档json地址
String docUrl = SwaggerDocUtil.replaceSwaggerResources(apiDoc.getDocUrl());
if (SwaggerDocUtil.isSwaggerResources(docUrl)) {
String swaggerDomain = SwaggerDocUtil.getSwaggerResourceDomain(docUrl);
List<SwaggerResource> resourceList;
try {
String resourcesStr = swaggerHttpRequestService.requestSwaggerUrl(request, 0L, docUrl, swaggerDomain);
resourceList = JSON.parseArray(resourcesStr, SwaggerResource.class);
} catch (Exception e) {
e.printStackTrace();
return DocResponseJson.warn("解析文档地址失败:" + e.getMessage());
}
if (resourceList == null || resourceList.isEmpty()) {
return DocResponseJson.warn("该地址未找到文档");
}
// 删除原有文档
if (apiDoc.getId() != null) {
apiDocService.removeById(apiDoc.getId());
}
// 存明细地址
for (SwaggerResource resource : resourceList) {
apiDoc.setId(null);
apiDoc.setDocUrl(swaggerDomain + resource.getUrl());
apiDoc.setName(resource.getName());
apiDoc.setShareUuid(IdUtil.simpleUUID());
apiDocService.save(apiDoc);
}
} else {
apiDocService.saveOrUpdate(apiDoc);
}
} else if (Objects.equals(apiDoc.getDocType(), 2)
|| Objects.equals(apiDoc.getDocType(), 3)
|| Objects.equals(apiDoc.getDocType(), 4)
|| Objects.equals(apiDoc.getDocType(), 5)) {
apiDocService.saveOrUpdate(apiDoc);
} else {
return DocResponseJson.warn("暂不支持的文档类型");
}
return DocResponseJson.ok(apiDoc);
}
/**
* 修改文档基本信息
*
* @return 无
* @author 暮光:城中城
* @since 2021年10月16日
*/
@ResponseBody
@PostMapping(value = "/update")
public ResponseJson<List<ApiDoc>> update(ApiDoc apiDoc) {
if (apiDoc.getId() == null) {
return DocResponseJson.warn("请指定修改的记录ID");
}
// 基本信息可以改,删除需要管理员权限
if (Objects.equals(apiDoc.getYn(), 0)) {
if (!apiDocAuthJudgeService.haveManageAuth(apiDoc.getId())) {
return DocResponseJson.warn("没有此文档的删除权限");
}
} else {
if (!apiDocAuthJudgeService.haveDevelopAuth(apiDoc.getId())) {
return DocResponseJson.warn("没有此文档的编辑权限");
}
}
ApiDoc swaggerDocUp = new ApiDoc();
swaggerDocUp.setId(apiDoc.getId());
swaggerDocUp.setDocStatus(apiDoc.getDocStatus());
swaggerDocUp.setShareInstruction(apiDoc.getShareInstruction());
swaggerDocUp.setYn(apiDoc.getYn());
apiDocService.updateById(swaggerDocUp);
return DocResponseJson.ok();
}
@RequestMapping("/apis")
public ResponseJson<List<ApiDoc>> resources() {
List<ApiDoc> docList = apiDocService.getApiDocList();
return DocResponseJson.ok(docList);
}
@RequestMapping("/apis/detail")
public ResponseJson<Object> detail(HttpServletRequest request, Long id) {
ApiDoc apiDoc = apiDocService.getById(id);
if (apiDoc == null) {
return DocResponseJson.warn("文档不存在");
}
if (!apiDocAuthJudgeService.haveDevelopAuth(apiDoc)) {
return DocResponseJson.warn("没有此文档的查看权限");
}
if (Objects.equals(apiDoc.getDocType(), 1) || Objects.equals(apiDoc.getDocType(), 3)) {
try {
String docsDomain = SwaggerDocUtil.getV2ApiDocsDomain(apiDoc.getDocUrl());
String contentStr = swaggerHttpRequestService.requestSwaggerUrl(request, apiDoc.getId(), apiDoc.getDocUrl(), docsDomain);
return DocResponseJson.ok(contentStr);
} catch (Exception e) {
e.printStackTrace();
return DocResponseJson.warn("请求文档失败");
}
}
if (Objects.equals(apiDoc.getDocType(), 2) || Objects.equals(apiDoc.getDocType(), 4)) {
return DocResponseJson.ok(apiDoc.getJsonContent());
}
if (Objects.equals(apiDoc.getDocType(), 5)) {
List<ApiCustomDocVo> customVoList = apiCustomNodeService.buildCustomApiList(apiDoc);
return DocResponseJson.ok(customVoList);
}
return DocResponseJson.warn("暂不支持的文档类型");
}
}

View File

@@ -0,0 +1,118 @@
package com.zyplayer.doc.api.controller;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.zyplayer.doc.core.annotation.AuthMan;
import com.zyplayer.doc.core.json.DocResponseJson;
import com.zyplayer.doc.core.json.ResponseJson;
import com.zyplayer.doc.data.config.security.DocUserDetails;
import com.zyplayer.doc.data.config.security.DocUserUtil;
import com.zyplayer.doc.data.repository.manage.entity.ApiDoc;
import com.zyplayer.doc.data.repository.manage.entity.ApiGlobalParam;
import com.zyplayer.doc.data.service.common.ApiDocAuthJudgeService;
import com.zyplayer.doc.data.service.manage.ApiGlobalParamService;
import org.apache.commons.collections.CollectionUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import java.util.Date;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
/**
* 全局参数控制器
*
* @author 暮光:城中城
* @since 2021年10月16日
*/
@AuthMan
@RestController
@RequestMapping("/doc-api/global-param")
public class ApiGlobalParamController {
private static Logger logger = LoggerFactory.getLogger(ApiGlobalParamController.class);
@Resource
private ApiGlobalParamService apiGlobalParamService;
@Resource
ApiDocAuthJudgeService apiDocAuthJudgeService;
/**
* 获取所有的全局参数
*
* @return 全局参数列表
* @author 暮光:城中城
* @since 2021年10月16日
*/
@ResponseBody
@PostMapping(value = "/list")
public ResponseJson<List<ApiGlobalParam>> list(Long docId) {
Long docIdNew = Optional.ofNullable(docId).orElse(0L);
if (docIdNew > 0 && !apiDocAuthJudgeService.haveDevelopAuth(docIdNew)) {
return DocResponseJson.warn("没有此文档的查看权限");
}
DocUserDetails currentUser = DocUserUtil.getCurrentUser();
QueryWrapper<ApiGlobalParam> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("yn", 1);
queryWrapper.eq("doc_id", docIdNew);
// 全局参数才按创建人来控制,文档的全局参数大家共用
queryWrapper.eq(docIdNew == 0, "create_user_id", currentUser.getUserId());
queryWrapper.orderByDesc("id");
List<ApiGlobalParam> globalParamList = apiGlobalParamService.list(queryWrapper);
return DocResponseJson.ok(globalParamList);
}
/**
* 修改全局参数
*
* @return 无
* @author 暮光:城中城
* @since 2021年10月16日
*/
@ResponseBody
@PostMapping(value = "/update")
public ResponseJson<List<ApiDoc>> update(ApiGlobalParam globalParam) {
DocUserDetails currentUser = DocUserUtil.getCurrentUser();
globalParam.setDocId(Optional.ofNullable(globalParam.getDocId()).orElse(0L));
// 新的文档ID是否有权限
if (globalParam.getDocId() > 0 && !apiDocAuthJudgeService.haveDevelopAuth(globalParam.getDocId())) {
return DocResponseJson.warn("没有此文档的查看权限");
}
if (globalParam.getId() == null) {
globalParam.setYn(1);
globalParam.setCreateTime(new Date());
globalParam.setCreateUserId(currentUser.getUserId());
globalParam.setCreateUserName(currentUser.getUsername());
} else {
ApiGlobalParam param = apiGlobalParamService.getById(globalParam.getId());
if (param.getDocId() > 0) {
// 已有的文档ID是否有权限
if (!apiDocAuthJudgeService.haveDevelopAuth(param.getDocId())) {
return DocResponseJson.warn("没有此文档的查看权限");
}
} else {
if (!Objects.equals(param.getCreateUserId(), currentUser.getUserId())) {
return DocResponseJson.warn("目标全局参数不存在");
}
}
}
QueryWrapper<ApiGlobalParam> wrapper = new QueryWrapper<>();
wrapper.eq("yn", 1);
wrapper.eq("param_key", globalParam.getParamKey());
wrapper.eq("doc_id", globalParam.getDocId());
// 全局参数才按创建人来控制,文档的全局参数大家共用
wrapper.eq(globalParam.getDocId() == 0, "create_user_id", currentUser.getUserId());
List<ApiGlobalParam> paramList = apiGlobalParamService.list(wrapper);
if (CollectionUtils.isNotEmpty(paramList)) {
if (paramList.size() > 1 || !Objects.equals(paramList.get(0).getId(), globalParam.getId())) {
return DocResponseJson.warn("全局参数名称不能重复");
}
}
apiGlobalParamService.saveOrUpdate(globalParam);
return DocResponseJson.ok();
}
}

View File

@@ -0,0 +1,83 @@
package com.zyplayer.doc.api.controller;
import com.zyplayer.doc.core.annotation.AuthMan;
import com.zyplayer.doc.core.json.DocResponseJson;
import com.zyplayer.doc.core.json.ResponseJson;
import com.zyplayer.doc.api.controller.param.ProxyRequestParam;
import com.zyplayer.doc.api.controller.vo.ProxyRequestResultVo;
import com.zyplayer.doc.api.service.SwaggerHttpRequestService;
import com.zyplayer.doc.data.repository.manage.entity.ApiCustomNode;
import com.zyplayer.doc.data.repository.manage.entity.ApiCustomParams;
import com.zyplayer.doc.data.service.manage.ApiCustomNodeService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 请求参数控制器
*
* @author 暮光:城中城
* @since 2021年10月16日
*/
@AuthMan
@RestController
@RequestMapping("/doc-api/proxy")
public class ApiPoxyRequestController {
private static Logger logger = LoggerFactory.getLogger(ApiPoxyRequestController.class);
@Resource
ApiCustomNodeService apiCustomNodeService;
@Resource
private SwaggerHttpRequestService swaggerHttpRequestService;
/**
* 代理接口请求
*
* @return 请求参数
* @author 暮光:城中城
* @since 2021年10月16日
*/
@ResponseBody
@PostMapping(value = "/request")
public ResponseJson<ProxyRequestResultVo> request(HttpServletRequest request, ProxyRequestParam requestParam) {
// 自建接口请求时保存信息
if (requestParam.getNodeId() != null) {
ApiCustomNode apiCustomNode = new ApiCustomNode();
apiCustomNode.setNodeType(1);
apiCustomNode.setId(requestParam.getNodeId());
apiCustomNode.setDocId(requestParam.getDocId());
apiCustomNode.setNodeName(requestParam.getApiName());
ApiCustomParams apiCustomParams = new ApiCustomParams();
apiCustomParams.setApiUrl(requestParam.getUrl());
apiCustomParams.setMethod(requestParam.getMethod());
apiCustomParams.setFormData(requestParam.getFormParam());
apiCustomParams.setBodyData(requestParam.getBodyParam());
apiCustomParams.setHeaderData(requestParam.getHeaderParam());
apiCustomParams.setCookieData(requestParam.getCookieParam());
apiCustomNodeService.addNode(apiCustomNode, apiCustomParams);
}
ProxyRequestResultVo requestResult = swaggerHttpRequestService.proxyRequest(request, requestParam);
return DocResponseJson.ok(requestResult);
}
/**
* 代理接口下载请求
*
* @return 请求参数
* @author 暮光:城中城
* @since 2021年10月16日
*/
@ResponseBody
@PostMapping(value = "/download")
public ResponseJson<ProxyRequestResultVo> download(HttpServletRequest request, HttpServletResponse response, ProxyRequestParam requestParam) {
swaggerHttpRequestService.proxyDownload(request, response, requestParam);
return DocResponseJson.ok();
}
}

View File

@@ -0,0 +1,75 @@
package com.zyplayer.doc.api.controller;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.zyplayer.doc.core.annotation.AuthMan;
import com.zyplayer.doc.core.json.DocResponseJson;
import com.zyplayer.doc.core.json.ResponseJson;
import com.zyplayer.doc.data.config.security.DocUserDetails;
import com.zyplayer.doc.data.config.security.DocUserUtil;
import com.zyplayer.doc.data.repository.manage.entity.ApiDoc;
import com.zyplayer.doc.data.repository.manage.entity.ApiRequestParam;
import com.zyplayer.doc.data.service.manage.ApiRequestParamService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import java.util.Date;
import java.util.List;
/**
* 请求参数控制器
*
* @author 暮光:城中城
* @since 2021年10月16日
*/
@AuthMan
@RestController
@RequestMapping("/doc-api/request-param")
public class ApiRequestParamController {
private static Logger logger = LoggerFactory.getLogger(ApiRequestParamController.class);
@Resource
private ApiRequestParamService apiRequestParamService;
/**
* 获取所有的请求参数
*
* @return 请求参数
* @author 暮光:城中城
* @since 2021年10月16日
*/
@ResponseBody
@PostMapping(value = "/query")
public ResponseJson<ApiRequestParam> query(String docUrl) {
QueryWrapper<ApiRequestParam> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("yn", 1);
queryWrapper.eq("doc_url", docUrl);
ApiRequestParam requestParam = apiRequestParamService.getOne(queryWrapper);
return DocResponseJson.ok(requestParam);
}
/**
* 修改请求参数
*
* @return 无
* @author 暮光:城中城
* @since 2021年10月16日
*/
@ResponseBody
@PostMapping(value = "/update")
public ResponseJson<List<ApiDoc>> update(ApiRequestParam apiRequestParam) {
QueryWrapper<ApiRequestParam> updateWrapper = new QueryWrapper<>();
updateWrapper.eq("doc_url", apiRequestParam.getDocUrl());
DocUserDetails currentUser = DocUserUtil.getCurrentUser();
apiRequestParam.setYn(1);
apiRequestParam.setCreateTime(new Date());
apiRequestParam.setCreateUserId(currentUser.getUserId());
apiRequestParam.setCreateUserName(currentUser.getUsername());
apiRequestParamService.update(apiRequestParam, updateWrapper);
return DocResponseJson.ok();
}
}

View File

@@ -0,0 +1,77 @@
package com.zyplayer.doc.api.controller;
import com.zyplayer.doc.api.framework.utils.SwaggerDocUtil;
import com.zyplayer.doc.api.service.SwaggerHttpRequestService;
import com.zyplayer.doc.core.json.DocResponseJson;
import com.zyplayer.doc.core.json.ResponseJson;
import com.zyplayer.doc.data.repository.manage.entity.ApiDoc;
import com.zyplayer.doc.data.service.manage.ApiDocService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.util.List;
import java.util.Objects;
/**
* 文档控制器
*
* @author 暮光:城中城
* @since 2021年10月16日
*/
@RestController
@RequestMapping("/doc-api/share")
public class ApiShareDocumentController {
private static Logger logger = LoggerFactory.getLogger(ApiShareDocumentController.class);
@Resource
private ApiDocService swaggerDocService;
@Resource
private SwaggerHttpRequestService swaggerHttpRequestService;
/**
* 获取文档内容
*
* @return 文档内容
* @author 暮光:城中城
* @since 2021年10月16日
*/
@ResponseBody
@PostMapping(value = "/detail")
public ResponseJson<List<ApiDoc>> detail(String shareUuid) {
ApiDoc apiDoc = swaggerDocService.getByShareUuid(shareUuid);
if (apiDoc == null) {
return DocResponseJson.warn("文档不存在");
}
apiDoc.setDocUrl(null);
apiDoc.setJsonContent(null);
return DocResponseJson.ok(apiDoc);
}
@RequestMapping("/apis/detail")
public ResponseJson<Object> detail(HttpServletRequest request, String shareUuid) {
ApiDoc apiDoc = swaggerDocService.getByShareUuid(shareUuid);
if (apiDoc == null) {
return DocResponseJson.warn("文档不存在");
}
if (Objects.equals(apiDoc.getDocType(), 1)) {
try {
String docsDomain = SwaggerDocUtil.getV2ApiDocsDomain(apiDoc.getDocUrl());
String contentStr = swaggerHttpRequestService.requestSwaggerUrl(request, apiDoc.getId(), apiDoc.getDocUrl(), docsDomain);
return DocResponseJson.ok(contentStr);
} catch (Exception e) {
e.printStackTrace();
return DocResponseJson.warn("请求文档失败");
}
}
if (Objects.equals(apiDoc.getDocType(), 2) || Objects.equals(apiDoc.getDocType(), 4)) {
return DocResponseJson.ok(apiDoc.getJsonContent());
}
return DocResponseJson.warn("暂不支持的文档类型");
}
}

View File

@@ -0,0 +1,99 @@
package com.zyplayer.doc.api.controller;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.zyplayer.doc.core.annotation.AuthMan;
import com.zyplayer.doc.core.exception.ConfirmException;
import com.zyplayer.doc.core.json.DocResponseJson;
import com.zyplayer.doc.data.repository.manage.entity.ApiDoc;
import com.zyplayer.doc.data.service.manage.ApiDocService;
import com.zyplayer.doc.api.controller.vo.SwaggerResourceVo;
import com.zyplayer.doc.api.framework.utils.SwaggerDocUtil;
import com.zyplayer.doc.api.service.SwaggerHttpRequestService;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.util.MimeTypeUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import springfox.documentation.spring.web.json.Json;
import springfox.documentation.swagger.web.*;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.util.*;
/**
* 承接了所有的ApiResourceController的接口
*
* @author 暮光:城中城
* @since 2021年10月16日
*/
@AuthMan
@RestController
public class ApiSwaggerProxyController {
private static final String HAL_MEDIA_TYPE = "application/hal+json";
@Resource
private ApiDocService apiDocService;
@Resource
private SwaggerHttpRequestService swaggerHttpRequestService;
@ResponseBody
@RequestMapping("/swagger-resources")
public List<SwaggerResourceVo> swaggerResources() {
List<SwaggerResourceVo> resourceList = new LinkedList<>();
QueryWrapper<ApiDoc> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("yn", 1);
queryWrapper.eq("doc_status", 1);
queryWrapper.eq("open_visit", 1);
queryWrapper.in("doc_type", 1, 2);
queryWrapper.orderByAsc("id");
queryWrapper.select("id", "name", "rewrite_domain");
List<ApiDoc> docList = apiDocService.list(queryWrapper);
for (ApiDoc apiDoc : docList) {
SwaggerResourceVo resource = new SwaggerResourceVo();
resource.setUrl("/v2/api-docs?id=" + apiDoc.getId());
resource.setName(apiDoc.getName());
resource.setSwaggerVersion("2.0");
resource.setRewriteDomain(apiDoc.getRewriteDomain());
resourceList.add(resource);
}
return resourceList;
}
@ResponseBody
@RequestMapping(value = "/v2/api-docs", produces = {MimeTypeUtils.APPLICATION_JSON_VALUE, HAL_MEDIA_TYPE})
public ResponseEntity<Object> content(HttpServletRequest request, Long id) {
ApiDoc apiDoc = apiDocService.getById(id);
if (apiDoc == null || !Objects.equals(apiDoc.getOpenVisit(), 1)) {
throw new ConfirmException("文档不存在");
}
if (Objects.equals(apiDoc.getDocType(), 1)) {
try {
String docsDomain = SwaggerDocUtil.getV2ApiDocsDomain(apiDoc.getDocUrl());
String contentStr = swaggerHttpRequestService.requestSwaggerUrl(request, apiDoc.getId(), apiDoc.getDocUrl(), docsDomain);
return new ResponseEntity<>(new Json(contentStr), HttpStatus.OK);
} catch (Exception e) {
e.printStackTrace();
return new ResponseEntity<>(DocResponseJson.warn("请求文档失败"), HttpStatus.OK);
}
}
return new ResponseEntity<>(new Json(apiDoc.getJsonContent()), HttpStatus.OK);
}
@ResponseBody
@RequestMapping(value = "/swagger-resources/configuration/security")
public ResponseEntity<SecurityConfiguration> securityConfiguration() {
SecurityConfiguration securityConfiguration = SecurityConfigurationBuilder.builder().build();
return new ResponseEntity<>(securityConfiguration, HttpStatus.OK);
}
@ResponseBody
@RequestMapping(value = "/swagger-resources/configuration/ui")
public ResponseEntity<UiConfiguration> uiConfiguration() {
UiConfiguration uiConfiguration = UiConfigurationBuilder.builder().build();
return new ResponseEntity<>(uiConfiguration, HttpStatus.OK);
}
}

View File

@@ -0,0 +1,15 @@
package com.zyplayer.doc.api.controller.param;
import lombok.Data;
/**
* 参数信息
*
* @author 暮光:城中城
* @since 2021-11-04
*/
@Data
public class ParamData {
private String code;
private String value;
}

View File

@@ -0,0 +1,45 @@
package com.zyplayer.doc.api.controller.param;
import com.alibaba.fastjson.JSON;
import lombok.Data;
import java.util.List;
/**
* 代理请求参数
*
* @author 暮光:城中城
* @since 2021-11-04
*/
@Data
public class ProxyRequestParam {
private Long docId;
private Long nodeId;
private String url;
private String host;
private String method;
private String contentType;
private String headerParam;
private String cookieParam;
private String formParam;
private String formEncodeParam;
private String bodyParam;
private String apiName;
public List<ParamData> getHeaderParamData() {
return JSON.parseArray(headerParam, ParamData.class);
}
public List<ParamData> getCookieParamData() {
return JSON.parseArray(cookieParam, ParamData.class);
}
public List<ParamData> getFormParamData() {
return JSON.parseArray(formParam, ParamData.class);
}
public List<ParamData> getFormEncodeParamData() {
return JSON.parseArray(formEncodeParam, ParamData.class);
}
}

View File

@@ -0,0 +1,78 @@
package com.zyplayer.doc.api.controller.vo;
import lombok.Data;
@Data
public class ApiCustomParamsVo {
/**
* 节点ID
*/
private Long id;
/**
* 父文件夹ID
*/
private Long parentId;
/**
* 节点类型 0=目录 1=接口
*/
private Integer nodeType;
/**
* 节点名称
*/
private String nodeName;
/**
* 节点说明
*/
private String nodeDesc;
/**
* 节点顺序
*/
private Integer seqNo;
/**
* api_doc主键ID
*/
private Long docId;
/**
* 节点ID
*/
private Long nodeId;
/**
* 请求方式get、head、post、put、patch、delete、options、trace
*/
private String method;
/**
* 接口url
*/
private String apiUrl;
/**
* form参数
*/
private String formData;
/**
* body参数
*/
private String bodyData;
/**
* header参数
*/
private String headerData;
/**
* cookie参数
*/
private String cookieData;
}

View File

@@ -0,0 +1,83 @@
package com.zyplayer.doc.api.controller.vo;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
/**
* api文档地址Vo
*
* @author 暮光:城中城
* @since 2021-11-25
*/
@Data
public class ApiDocVo implements Serializable {
private Long id;
/**
* 文档名称
*/
private String name;
/**
* 文档类型 1=swagger url 2=swagger json 3=openapi url 4=openapi json 5=自建API分组
*/
private Integer docType;
/**
* 文档URL地址
*/
private String docUrl;
/**
* 文档json内容
*/
private String jsonContent;
/**
* 重写的域名
*/
private String rewriteDomain;
/**
* 是否开放访问 0=否 1=是
*/
private Integer openVisit;
/**
* 状态 1=启用 2=禁用
*/
private Integer docStatus;
/**
* 开放文档UUID
*/
private String shareUuid;
/**
* 开放文档使用说明
*/
private String shareInstruction;
/**
* 创建人ID
*/
private Long createUserId;
/**
* 创建人名字
*/
private String createUserName;
/**
* 创建时间
*/
private Date createTime;
/**
* 是否有效 0=无效 1=有效
*/
private Integer yn;
}

View File

@@ -0,0 +1,48 @@
package com.zyplayer.doc.api.controller.vo;
import lombok.Data;
/**
* 用户权限返回值对象
*
* @author 暮光:城中城
* @since 2021年12月12日
*/
@Data
public class DocUserAuthVo {
/**
* 权限类型
*/
private Integer authType;
/**
* 用户ID
*/
private Long userId;
/**
* 用户编号,用于登录等
*/
private String userNo;
/**
* 用户名
*/
private String userName;
/**
* 邮箱
*/
private String email;
/**
* 手机号
*/
private String phone;
/**
* 性别 0=女 1=男
*/
private Integer sex;
}

View File

@@ -0,0 +1,19 @@
package com.zyplayer.doc.api.controller.vo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* cookie返回值对象
*
* @author 暮光:城中城
* @since 2018年8月21日
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class HttpCookieVo {
private String name;
private String value;
}

View File

@@ -0,0 +1,15 @@
package com.zyplayer.doc.api.controller.vo;
import lombok.Data;
/**
* header返回值对象
*
* @author 暮光:城中城
* @since 2018年8月21日
*/
@Data
public class HttpHeaderVo {
private String name;
private String value;
}

View File

@@ -0,0 +1,23 @@
package com.zyplayer.doc.api.controller.vo;
import lombok.Data;
import java.util.List;
/**
* 代理请求结果
*
* @author 暮光:城中城
* @since 2021-11-04
*/
@Data
public class ProxyRequestResultVo {
private List<HttpCookieVo> cookies;
private List<HttpHeaderVo> headers;
private Integer status;
private Long useTime;
private Integer contentLength;
private String data;
private String errorMsg;
}

View File

@@ -0,0 +1,26 @@
package com.zyplayer.doc.api.controller.vo;
import com.google.common.collect.ComparisonChain;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* swagger资源信息
*
* @author 暮光:城中城
* @since 2021-11-04
*/
@Data
@NoArgsConstructor
public class SwaggerResourceVo implements Comparable<SwaggerResourceVo> {
private String name;
private String url;
private String swaggerVersion;
private String rewriteDomain;
@Override
public int compareTo(SwaggerResourceVo other) {
return ComparisonChain.start().compare(this.swaggerVersion, other.swaggerVersion).compare(this.name, other.name).result();
}
}

View File

@@ -0,0 +1,23 @@
package com.zyplayer.doc.api.framework.config;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import java.lang.annotation.*;
/**
* 开启api接口文档模块注解
*
* @author 暮光:城中城
* @since 2021-11-04
*/
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration
@ComponentScan(basePackages = {
"com.zyplayer.doc.api",
})
public @interface EnableDocApi {
}

View File

@@ -0,0 +1,53 @@
package com.zyplayer.doc.api.framework.utils;
/**
* swagger文档工具类
*
* @author 暮光:城中城
* @since 2021-11-04
*/
public class SwaggerDocUtil {
public static String replaceSwaggerResources(String docUrl) {
int htmlIndex = docUrl.indexOf("/swagger-ui.html");
if (htmlIndex > 0) {
docUrl = docUrl.substring(0, htmlIndex) + "/swagger-resources";
}
return docUrl;
}
public static boolean isSwaggerResources(String docUrl) {
return docUrl.contains("/swagger-resources");
}
public static String getSwaggerResourceDomain(String docUrl) {
int index = docUrl.indexOf("/swagger-resources");
if (index >= 0) {
return docUrl.substring(0, index);
}
return "";
}
public static String getV2ApiDocsDomain(String docUrl) {
int index = docUrl.indexOf("/v2/api-docs");
if (index >= 0) {
return docUrl.substring(0, index);
}
return "";
}
public static String getDomainHost(String domain) {
domain = domain.replace("http://", "");
domain = domain.replace("https://", "");
int index = domain.indexOf("/");
if (index >= 0) {
return domain.substring(0, index);
}
return domain;
}
public static boolean isSwaggerLocation(String docUrl) {
return docUrl.contains("/v2/api-docs");
}
}

View File

@@ -0,0 +1,251 @@
package com.zyplayer.doc.api.service;
import cn.hutool.core.io.resource.BytesResource;
import cn.hutool.core.io.resource.MultiResource;
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;
import cn.hutool.http.HttpUtil;
import cn.hutool.http.Method;
import com.zyplayer.doc.api.controller.param.ProxyRequestParam;
import com.zyplayer.doc.api.controller.vo.HttpCookieVo;
import com.zyplayer.doc.api.controller.vo.HttpHeaderVo;
import com.zyplayer.doc.api.controller.vo.ProxyRequestResultVo;
import com.zyplayer.doc.api.framework.utils.SwaggerDocUtil;
import com.zyplayer.doc.core.exception.ConfirmException;
import com.zyplayer.doc.data.repository.manage.entity.ApiGlobalParam;
import com.zyplayer.doc.data.service.manage.ApiGlobalParamService;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.collections.MapUtils;
import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.support.StandardMultipartHttpServletRequest;
import javax.annotation.Resource;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.HttpCookie;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;
/**
* swagger请求服务
*
* @author 暮光:城中城
* @since 2021-11-04
*/
@Service
public class SwaggerHttpRequestService {
private static 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");
/**
* 请求真实的swagger文档内容
*
* @author 暮光:城中城
* @since 2021-11-04
*/
public String requestSwaggerUrl(HttpServletRequest request, Long docId, String docUrl, String docDomain) {
List<ApiGlobalParam> globalParamList = apiGlobalParamService.getGlobalParamList(docId);
Map<String, Object> globalFormParamMap = globalParamList.stream().filter(item -> Objects.equals(item.getParamType(), 1))
.collect(Collectors.toMap(ApiGlobalParam::getParamKey, ApiGlobalParam::getParamValue, (val1, val2) -> val1));
Map<String, String> globalHeaderParamMap = globalParamList.stream().filter(item -> Objects.equals(item.getParamType(), 2))
.collect(Collectors.toMap(ApiGlobalParam::getParamKey, ApiGlobalParam::getParamValue, (val1, val2) -> val1));
Map<String, String> globalCookieParamMap = globalParamList.stream().filter(item -> Objects.equals(item.getParamType(), 3))
.collect(Collectors.toMap(ApiGlobalParam::getParamKey, ApiGlobalParam::getParamValue, (val1, val2) -> val1));
Map<String, String> requestHeaders = this.getHttpHeader(request, globalHeaderParamMap);
if (StringUtils.isNotBlank(docDomain)) {
domainHeaderKeys.forEach(key -> requestHeaders.put(key, docDomain));
requestHeaders.put("host", SwaggerDocUtil.getDomainHost(docDomain));
}
// 执行请求
String resultStr = 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;
}
/**
* 执行代理请求
*
* @author 暮光:城中城
* @since 2021-11-04
*/
public void proxyDownload(HttpServletRequest request, HttpServletResponse response, ProxyRequestParam requestParam) {
try {
HttpResponse httpResponse = this.getHttpResponse(request, requestParam);
Map<String, List<String>> responseHeaders = httpResponse.headers();
if (MapUtils.isNotEmpty(responseHeaders)) {
for (Map.Entry<String, List<String>> httpHeader : responseHeaders.entrySet()) {
response.addHeader(httpHeader.getKey(), String.join(";", httpHeader.getValue()));
}
}
httpResponse.writeBody(response.getOutputStream(), true, null);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 执行代理请求
*
* @author 暮光:城中城
* @since 2021-11-04
*/
public ProxyRequestResultVo proxyRequest(HttpServletRequest request, ProxyRequestParam requestParam) {
ProxyRequestResultVo resultVo = new ProxyRequestResultVo();
long startTime = System.currentTimeMillis();
try {
HttpResponse httpResponse = getHttpResponse(request, requestParam);
resultVo.setData(httpResponse.body());
resultVo.setStatus(httpResponse.getStatus());
resultVo.setContentLength(httpResponse.bodyBytes().length);
// 设置返回的cookies
List<HttpCookie> responseCookies = httpResponse.getCookies();
if (CollectionUtils.isNotEmpty(responseCookies)) {
resultVo.setCookies(responseCookies.stream().map(val -> new HttpCookieVo(val.getName(), val.getValue())).collect(Collectors.toList()));
}
// 设置返回的headers
Map<String, List<String>> responseHeaders = httpResponse.headers();
if (MapUtils.isNotEmpty(responseHeaders)) {
List<HttpHeaderVo> headerList = new ArrayList<>(responseHeaders.size());
for (Map.Entry<String, List<String>> httpHeader : responseHeaders.entrySet()) {
HttpHeaderVo vo = new HttpHeaderVo();
vo.setName(httpHeader.getKey());
vo.setValue(String.join(";", httpHeader.getValue()));
headerList.add(vo);
}
resultVo.setHeaders(headerList);
}
} catch (Exception e) {
e.printStackTrace();
resultVo.setErrorMsg(e.getMessage());
}
resultVo.setUseTime(System.currentTimeMillis() - startTime);
return resultVo;
}
private HttpResponse getHttpResponse(HttpServletRequest request, ProxyRequestParam requestParam) {
// 执行请求
Method method = requestMethodMap.get(requestParam.getMethod());
if (method == null) {
throw new ConfirmException("不支持的请求方式:" + requestParam.getMethod());
}
HttpRequest httpRequest = HttpUtil.createRequest(method, requestParam.getUrl());
// header获取
Map<String, String> headerParam = new HashMap<>();
requestParam.getHeaderParamData().forEach(item -> headerParam.put(item.getCode(), item.getValue()));
Map<String, String> requestHeaders = this.getHttpHeader(request, headerParam);
if (StringUtils.isNotBlank(requestParam.getHost())) {
domainHeaderKeys.forEach(key -> requestHeaders.put(key, requestParam.getHost()));
requestHeaders.put("host", SwaggerDocUtil.getDomainHost(requestParam.getHost()));
}
// http自带参数
httpRequest.addHeaders(requestHeaders);
// 用户输入的参数
requestParam.getFormParamData().forEach(data -> httpRequest.form(data.getCode(), data.getValue()));
requestParam.getFormEncodeParamData().forEach(data -> httpRequest.form(data.getCode(), data.getValue()));
// 文件参数
if (request instanceof StandardMultipartHttpServletRequest) {
StandardMultipartHttpServletRequest multipartRequest = (StandardMultipartHttpServletRequest) request;
Iterator<String> fileNames = multipartRequest.getFileNames();
while (fileNames.hasNext()) {
String fileName = fileNames.next();
String originKey = fileName.replace("_file_", "");
List<MultipartFile> fileList = multipartRequest.getFiles(fileName);
try {
if (fileList.size() > 1) {
MultiResource multiResource = new MultiResource();
for (MultipartFile file : fileList) {
multiResource.add(new BytesResource(file.getBytes(), file.getOriginalFilename()));
}
httpRequest.form(originKey, multiResource);
} else if (fileList.size() > 0) {
MultipartFile multipartFile = fileList.get(0);
httpRequest.form(originKey, multipartFile.getBytes(), multipartFile.getOriginalFilename());
}
} catch (IOException e) {
logger.error("读取上传的文件失败", e);
}
}
}
// cookie参数
Map<String, String> cookieParam = new HashMap<>();
String headerCookie = headerParam.getOrDefault("Cookie", headerParam.get("cookie"));
requestParam.getCookieParamData().forEach(item -> cookieParam.put(item.getCode(), item.getValue()));
httpRequest.cookie(this.getHttpCookie(request, cookieParam, headerCookie));
if (StringUtils.isNotBlank(requestParam.getBodyParam())) {
httpRequest.body(requestParam.getBodyParam());
}
// 强制设置类型貌似不用刻意设置如果写的application/json参数是表单传过去收不到值先注释这个
// if (StringUtils.isNotBlank(requestParam.getContentType())) {
// httpRequest.contentType(requestParam.getContentType());
// }
// 执行请求
return httpRequest.timeout(10000).execute();
}
/**
* 获取http的cookie
*
* @author 暮光:城中城
* @since 2021-11-04
*/
private List<HttpCookie> getHttpCookie(HttpServletRequest request, Map<String, String> globalCookieParamMap, String headerCookie) {
List<HttpCookie> httpCookies = new LinkedList<>();
if (request.getCookies() != null) {
for (Cookie cookie : request.getCookies()) {
httpCookies.add(new HttpCookie(cookie.getName(), cookie.getValue()));
}
}
if (StringUtils.isNotBlank(headerCookie)) {
Arrays.stream(headerCookie.split(";")).map(String::trim).forEach(cookie -> {
String[] cookieArr = StringUtils.split(cookie, "=", 2);
if (ArrayUtils.getLength(cookieArr) == 2) {
httpCookies.add(new HttpCookie(cookieArr[0], cookieArr[1]));
}
});
}
if (MapUtils.isNotEmpty(globalCookieParamMap)) {
globalCookieParamMap.forEach((key, value) -> httpCookies.add(new HttpCookie(key, value)));
}
return httpCookies;
}
/**
* 获取http的header
*
* @author 暮光:城中城
* @since 2021-11-04
*/
private Map<String, String> getHttpHeader(HttpServletRequest request, Map<String, String> globalHeaderParamMap) {
Map<String, String> headerParamMap = new HashMap<>();
Enumeration<String> headerNames = request.getHeaderNames();
while (headerNames.hasMoreElements()) {
String headerName = StringUtils.lowerCase(headerNames.nextElement());
if (needRequestHeaderKeys.contains(headerName)) {
headerParamMap.put(headerName, request.getHeader(headerName));
}
}
if (MapUtils.isNotEmpty(globalHeaderParamMap)) {
headerParamMap.putAll(globalHeaderParamMap);
}
return headerParamMap;
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.7 KiB

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

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

@@ -0,0 +1 @@
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

@@ -0,0 +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.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};

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +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.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

@@ -0,0 +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.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

@@ -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

@@ -0,0 +1 @@
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};

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.7 KiB

View File

@@ -0,0 +1 @@
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};

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,72 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg xmlns="http://www.w3.org/2000/svg">
<metadata>Copyright (C) 2017 by original authors @ fontello.com</metadata>
<defs>
<font id="fontello" horiz-adv-x="1000" >
<font-face font-family="fontello" font-weight="400" font-stretch="normal" units-per-em="1000" ascent="850" descent="-150" />
<missing-glyph horiz-adv-x="1000" />
<glyph glyph-name="bold" unicode="&#xe800;" d="M310 1q41-18 78-18 210 0 210 187 0 64-23 101-15 24-34 41t-38 26-45 14-47 6-53 1q-40 0-56-6 0-29 0-88t-1-88q0-5 0-38t0-54 2-47 7-37z m-8 417q23-4 61-4 46 0 80 7t61 25 42 50 14 79q0 39-16 68t-45 46-60 24-69 8q-28 0-73-7 0-28 3-84t2-85q0-15 0-45t-1-44q0-26 1-38z m-302-497l1 53q9 2 48 9t59 15q4 7 7 15t4 19 4 18 1 21 0 19v36q0 548-12 572-2 5-12 8t-25 6-28 4-27 3-17 2l-2 46q55 1 190 6t208 6q13 0 38-1t38 0q39 0 76-7t72-24 60-39 41-59 16-76q0-29-9-54t-22-40-36-32-41-25-47-22q86-20 144-75t57-138q0-56-20-101t-52-72-77-48-91-27-98-8q-25 0-74 2t-74 1q-59 0-171-6t-129-7z" horiz-adv-x="785.7" />
<glyph glyph-name="italic" unicode="&#xe801;" d="M0-78l10 48q12 4 34 9t40 11 33 13q16 19 23 56 1 4 35 162t63 303 29 165v14q-13 8-30 11t-39 4-32 3l10 58q19-1 67-4t84-4 67-1q27 0 55 1t68 4 54 4q-2-22-10-50-17-6-57-16t-60-19q-5-10-8-23t-5-23-4-25-4-24q-15-82-49-234t-43-198q-1-5-7-32t-11-51-9-46-4-32l1-10q9-3 103-18-2-24-9-55-6 0-18-1t-18-1q-16 0-49 6t-48 6q-77 1-115 1-28 0-79-5t-68-7z" horiz-adv-x="571.4" />
<glyph glyph-name="thumb-tack" unicode="&#xe802;" d="M650 779q12 0 24-5 19-8 29-23t11-35v-719q0-19-11-35t-29-23q-10-4-24-4-27 0-47 18l-246 236-246-236q-20-19-46-19-13 0-25 5-18 7-29 23t-11 35v719q0 19 11 35t29 23q12 5 25 5h585z" horiz-adv-x="714.3" />
<glyph glyph-name="link" unicode="&#xe803;" d="M813 171q0 23-16 38l-116 116q-16 16-38 16-24 0-40-18 1-1 10-10t12-12 9-11 7-14 2-15q0-23-16-38t-38-16q-8 0-15 2t-14 7-11 9-12 12-10 10q-19-17-19-40 0-23 16-38l115-116q15-15 38-15 22 0 38 15l82 81q16 16 16 37z m-393 394q0 22-15 38l-115 115q-16 16-38 16-22 0-38-15l-82-82q-16-15-16-37 0-22 16-38l116-116q15-15 38-15 23 0 40 17-2 2-11 11t-12 12-8 10-7 14-2 16q0 22 15 38t38 15q9 0 16-2t14-7 11-8 12-12 10-11q18 17 18 41z m500-394q0-66-48-113l-82-81q-46-47-113-47-68 0-114 48l-115 115q-46 47-46 114 0 68 49 116l-49 49q-48-49-116-49-67 0-114 47l-116 116q-47 47-47 114t47 113l82 82q47 46 114 46 67 0 114-47l115-116q46-46 46-113 0-69-49-117l49-49q48 49 116 49 67 0 114-47l116-116q47-47 47-114z" horiz-adv-x="928.6" />
<glyph glyph-name="picture-o" unicode="&#xe804;" d="M357 529q0-45-31-76t-76-32-76 32-31 76 31 76 76 31 76-31 31-76z m572-215v-250h-786v107l178 179 90-89 285 285z m53 393h-893q-7 0-12-5t-6-13v-678q0-7 6-13t12-5h893q7 0 13 5t5 13v678q0 8-5 13t-13 5z m89-18v-678q0-37-26-63t-63-27h-893q-36 0-63 27t-26 63v678q0 37 26 63t63 27h893q37 0 63-27t26-63z" horiz-adv-x="1071.4" />
<glyph glyph-name="repeat" unicode="&#xe805;" d="M857 707v-250q0-14-10-25t-26-11h-250q-23 0-32 23-10 22 7 38l77 77q-82 77-194 77-58 0-111-23t-91-61-61-91-23-111 23-111 61-91 91-61 111-23q66 0 125 29t100 82q4 6 13 7 8 0 14-5l76-77q5-4 6-11t-5-13q-60-74-147-114t-182-41q-87 0-167 34t-136 92-92 137-34 166 34 166 92 137 136 92 167 34q82 0 158-31t137-88l72 72q17 18 39 8 22-9 22-33z" horiz-adv-x="857.1" />
<glyph glyph-name="undo" unicode="&#xe806;" d="M857 350q0-87-34-166t-91-137-137-92-166-34q-96 0-183 41t-147 114q-4 6-4 13t5 11l76 77q6 5 14 5 9-1 13-7 41-53 100-82t126-29q58 0 110 23t92 61 61 91 22 111-22 111-61 91-92 61-110 23q-55 0-105-20t-90-57l77-77q17-16 8-38-10-23-33-23h-250q-15 0-25 11t-11 25v250q0 24 22 33 22 10 39-8l72-72q60 57 137 88t159 31q87 0 166-34t137-92 91-137 34-166z" horiz-adv-x="857.1" />
<glyph glyph-name="trash-o" unicode="&#xe807;" d="M286 439v-321q0-8-5-13t-13-5h-36q-8 0-13 5t-5 13v321q0 8 5 13t13 5h36q8 0 13-5t5-13z m143 0v-321q0-8-5-13t-13-5h-36q-8 0-13 5t-5 13v321q0 8 5 13t13 5h36q8 0 13-5t5-13z m142 0v-321q0-8-5-13t-12-5h-36q-8 0-13 5t-5 13v321q0 8 5 13t13 5h36q7 0 12-5t5-13z m72-404v529h-500v-529q0-12 4-22t8-15 6-5h464q2 0 6 5t8 15 4 22z m-375 601h250l-27 65q-4 5-9 6h-177q-6-1-10-6z m518-18v-36q0-8-5-13t-13-5h-54v-529q0-46-26-80t-63-34h-464q-37 0-63 33t-27 79v531h-53q-8 0-13 5t-5 13v36q0 8 5 13t13 5h172l39 93q9 21 31 35t44 15h178q23 0 44-15t30-35l39-93h173q8 0 13-5t5-13z" horiz-adv-x="785.7" />
<glyph glyph-name="floppy-o" unicode="&#xe808;" d="M214-7h429v214h-429v-214z m500 0h72v500q0 8-6 21t-11 20l-157 156q-5 6-19 12t-22 5v-232q0-22-15-38t-38-16h-322q-22 0-37 16t-16 38v232h-72v-714h72v232q0 22 16 38t37 16h465q22 0 38-16t15-38v-232z m-214 518v178q0 8-5 13t-13 5h-107q-7 0-13-5t-5-13v-178q0-7 5-13t13-5h107q7 0 13 5t5 13z m357-18v-518q0-22-15-38t-38-16h-750q-23 0-38 16t-16 38v750q0 22 16 38t38 16h517q23 0 50-12t42-26l156-157q16-15 27-42t11-49z" horiz-adv-x="857.1" />
<glyph glyph-name="compress" unicode="&#xe809;" d="M429 314v-250q0-14-11-25t-25-10-25 10l-81 81-185-186q-5-5-13-5t-12 5l-64 64q-6 6-6 13t6 13l185 185-80 80q-11 11-11 25t11 25 25 11h250q14 0 25-11t11-25z m421 375q0-7-6-12l-185-186 80-80q11-11 11-25t-11-25-25-11h-250q-14 0-25 11t-10 25v250q0 14 10 25t25 10 25-10l81-80 185 185q6 5 13 5t13-5l63-64q6-5 6-13z" horiz-adv-x="857.1" />
<glyph glyph-name="eye" unicode="&#xe80a;" d="M929 314q-85 132-213 197 34-58 34-125 0-103-73-177t-177-73-177 73-73 177q0 67 34 125-128-65-213-197 75-114 187-182t242-68 243 68 186 182z m-402 215q0 11-8 19t-19 7q-70 0-120-50t-50-119q0-11 8-19t19-8 19 8 8 19q0 48 34 82t82 34q11 0 19 8t8 19z m473-215q0-19-11-38-78-129-210-206t-279-77-279 77-210 206q-11 19-11 38t11 39q78 128 210 205t279 78 279-78 210-205q11-20 11-39z" horiz-adv-x="1000" />
<glyph glyph-name="eye-slash" unicode="&#xe80b;" d="M310 105l43 79q-48 35-76 88t-27 114q0 67 34 125-128-65-213-197 94-144 239-209z m217 424q0 11-8 19t-19 7q-70 0-120-50t-50-119q0-11 8-19t19-8 19 8 8 19q0 48 34 82t82 34q11 0 19 8t8 19z m202 106q0-4 0-5-59-105-176-316t-176-316l-28-50q-5-9-15-9-7 0-75 39-9 6-9 16 0 7 25 49-80 36-147 96t-117 137q-11 17-11 38t11 39q86 131 212 207t277 76q50 0 100-10l31 54q5 9 15 9 3 0 10-3t18-9 18-10 18-10 10-7q9-5 9-15z m21-249q0-78-44-142t-117-91l157 280q4-25 4-47z m250-72q0-19-11-38-22-36-61-81-84-96-194-149t-234-53l41 74q119 10 219 76t169 171q-65 100-158 164l35 63q53-36 102-85t81-103q11-19 11-39z" horiz-adv-x="1000" />
<glyph glyph-name="question-circle" unicode="&#xe80c;" d="M500 82v107q0 8-5 13t-13 5h-107q-8 0-13-5t-5-13v-107q0-8 5-13t13-5h107q8 0 13 5t5 13z m143 375q0 49-31 91t-77 65-95 23q-136 0-207-119-9-13 4-24l74-55q4-4 10-4 9 0 14 7 30 38 48 51 19 14 48 14 27 0 48-15t21-33q0-21-11-34t-38-25q-35-15-65-48t-29-70v-20q0-8 5-13t13-5h107q8 0 13 5t5 13q0 10 12 27t30 28q18 10 28 16t25 19 25 27 16 34 7 45z m214-107q0-117-57-215t-156-156-215-58-216 58-155 156-58 215 58 215 155 156 216 58 215-58 156-156 57-215z" horiz-adv-x="857.1" />
<glyph glyph-name="times" unicode="&#xe80d;" d="M724 112q0-22-15-38l-76-76q-16-15-38-15t-38 15l-164 165-164-165q-16-15-38-15t-38 15l-76 76q-16 16-16 38t16 38l164 164-164 164q-16 16-16 38t16 38l76 76q16 16 38 16t38-16l164-164 164 164q16 16 38 16t38-16l76-76q15-15 15-38t-15-38l-164-164 164-164q15-15 15-38z" horiz-adv-x="785.7" />
<glyph glyph-name="align-left" unicode="&#xe80f;" d="M1000 100v-71q0-15-11-25t-25-11h-928q-15 0-25 11t-11 25v71q0 15 11 25t25 11h928q15 0 25-11t11-25z m-214 214v-71q0-15-11-25t-25-11h-714q-15 0-25 11t-11 25v71q0 15 11 25t25 11h714q15 0 25-11t11-25z m143 215v-72q0-14-11-25t-25-11h-857q-15 0-25 11t-11 25v72q0 14 11 25t25 10h857q14 0 25-10t11-25z m-215 214v-72q0-14-10-25t-25-10h-643q-15 0-25 10t-11 25v72q0 14 11 25t25 11h643q14 0 25-11t10-25z" horiz-adv-x="1000" />
<glyph glyph-name="align-center" unicode="&#xe810;" d="M1000 100v-71q0-15-11-25t-25-11h-928q-15 0-25 11t-11 25v71q0 15 11 25t25 11h928q15 0 25-11t11-25z m-214 214v-71q0-15-11-25t-25-11h-500q-14 0-25 11t-11 25v71q0 15 11 25t25 11h500q15 0 25-11t11-25z m143 215v-72q0-14-11-25t-25-11h-786q-14 0-25 11t-11 25v72q0 14 11 25t25 10h786q14 0 25-10t11-25z m-215 214v-72q0-14-10-25t-25-10h-358q-14 0-25 10t-10 25v72q0 14 10 25t25 11h358q14 0 25-11t10-25z" horiz-adv-x="1000" />
<glyph glyph-name="align-right" unicode="&#xe811;" d="M1000 100v-71q0-15-11-25t-25-11h-928q-15 0-25 11t-11 25v71q0 15 11 25t25 11h928q15 0 25-11t11-25z m0 214v-71q0-15-11-25t-25-11h-714q-14 0-25 11t-11 25v71q0 15 11 25t25 11h714q15 0 25-11t11-25z m0 215v-72q0-14-11-25t-25-11h-857q-14 0-25 11t-11 25v72q0 14 11 25t25 10h857q15 0 25-10t11-25z m0 214v-72q0-14-11-25t-25-10h-643q-14 0-25 10t-10 25v72q0 14 10 25t25 11h643q15 0 25-11t11-25z" horiz-adv-x="1000" />
<glyph glyph-name="arrows-alt" unicode="&#xf0b2;" d="M716 548l-198-198 198-198 80 80q17 18 39 8 22-9 22-33v-250q0-14-10-25t-26-11h-250q-23 0-32 23-10 21 7 38l81 81-198 198-198-198 80-81q17-17 8-38-10-23-33-23h-250q-15 0-25 11t-11 25v250q0 24 22 33 22 10 39-8l80-80 198 198-198 198-80-80q-11-11-25-11-7 0-14 3-22 9-22 33v250q0 14 11 25t25 11h250q23 0 33-23 9-21-8-38l-80-81 198-198 198 198-81 81q-17 17-7 38 9 23 32 23h250q15 0 26-11t10-25v-250q0-24-22-33-7-3-14-3-14 0-25 11z" horiz-adv-x="857.1" />
<glyph glyph-name="bars" unicode="&#xf0c9;" d="M857 100v-71q0-15-10-25t-26-11h-785q-15 0-25 11t-11 25v71q0 15 11 25t25 11h785q15 0 26-11t10-25z m0 286v-72q0-14-10-25t-26-10h-785q-15 0-25 10t-11 25v72q0 14 11 25t25 10h785q15 0 26-10t10-25z m0 285v-71q0-14-10-25t-26-11h-785q-15 0-25 11t-11 25v71q0 15 11 26t25 10h785q15 0 26-10t10-26z" horiz-adv-x="857.1" />
<glyph glyph-name="list-ul" unicode="&#xf0ca;" d="M214 64q0-44-31-76t-76-31-76 31-31 76 31 76 76 31 76-31 31-76z m0 286q0-45-31-76t-76-31-76 31-31 76 31 76 76 31 76-31 31-76z m786-232v-107q0-7-5-13t-13-5h-678q-8 0-13 5t-5 13v107q0 7 5 12t13 6h678q7 0 13-6t5-12z m-786 518q0-45-31-76t-76-31-76 31-31 76 31 76 76 31 76-31 31-76z m786-232v-108q0-7-5-12t-13-5h-678q-8 0-13 5t-5 12v108q0 7 5 12t13 5h678q7 0 13-5t5-12z m0 285v-107q0-7-5-12t-13-6h-678q-8 0-13 6t-5 12v107q0 8 5 13t13 5h678q7 0 13-5t5-13z" horiz-adv-x="1000" />
<glyph glyph-name="list-ol" unicode="&#xf0cb;" d="M213-54q0-45-31-70t-75-26q-60 0-96 37l31 49q28-25 60-25 16 0 28 8t12 24q0 35-59 31l-14 31q4 6 18 24t24 31 20 21v1q-9 0-27-1t-27 0v-30h-59v85h186v-49l-53-65q28-6 45-27t17-49z m1 350v-89h-202q-4 20-4 30 0 29 14 52t31 38 37 27 31 24 14 25q0 14-9 22t-22 7q-25 0-45-32l-47 33q13 28 40 44t59 16q40 0 68-23t28-63q0-28-19-51t-42-36-42-28-20-30h71v34h59z m786-178v-107q0-7-5-13t-13-5h-678q-8 0-13 5t-5 13v107q0 8 5 13t13 5h678q7 0 13-6t5-12z m-786 502v-56h-187v56h60q0 22 0 67t1 68v7h-1q-5-10-28-30l-40 42 76 71h59v-225h60z m786-216v-108q0-7-5-12t-13-5h-678q-8 0-13 5t-5 12v108q0 7 5 12t13 5h678q7 0 13-5t5-12z m0 285v-107q0-7-5-12t-13-6h-678q-8 0-13 6t-5 12v107q0 8 5 13t13 5h678q7 0 13-5t5-13z" horiz-adv-x="1000" />
<glyph glyph-name="strikethrough" unicode="&#xf0cc;" d="M982 350q8 0 13-5t5-13v-36q0-7-5-12t-13-5h-964q-8 0-13 5t-5 12v36q0 8 5 13t13 5h964z m-712 36q-16 19-29 44-27 55-27 105 0 101 75 173 74 71 219 71 28 0 94-11 36-7 98-27 6-21 12-66 8-68 8-102 0-10-3-25l-7-2-46 4-8 1q-28 83-58 114-49 51-117 51-64 0-101-33-38-32-38-81 0-41 37-78t156-72q38-12 96-37 33-16 53-29h-414z m283-143h229q4-22 4-51 0-62-23-119-13-31-40-58-20-19-61-45-44-27-85-37-45-12-113-12-64 0-109 13l-78 23q-32 8-40 15-5 5-5 12v8q0 60-1 87 0 17 0 38l1 20v25l57 1q8-19 17-40t12-31 7-15q20-32 45-52 24-20 59-32 33-12 73-12 36 0 78 15 43 14 68 48 26 34 26 72 0 47-45 87-19 16-76 40z" horiz-adv-x="1000" />
<glyph glyph-name="underline" unicode="&#xf0cd;" d="M27 726q-21 1-25 2l-2 49q7 1 22 1 34 0 63-3 74-4 93-4 47 0 93 2 65 2 82 3 31 0 48 1l-1-8 1-36v-5q-33-5-69-5-33 0-44-14-7-7-7-73 0-7 0-18t0-15l1-127 8-157q3-69 28-112 20-33 54-52 49-26 98-26 59 0 107 16 31 10 55 28 27 20 37 36 20 31 29 63 12 41 12 128 0 44-2 72t-6 68-8 89l-2 33q-3 37-13 49-19 20-43 19l-56-1-8 2 1 48h47l114-6q43-2 110 6l10-1q3-22 3-29 0-4-2-17-25-7-47-8-41-6-44-9-8-8-8-23 0-4 0-15t1-17q5-11 13-221 3-109-9-170-8-42-23-68-21-36-62-69-42-31-102-49-61-19-142-19-93 0-159 26-66 26-99 68-34 42-47 109-9 45-9 132v186q0 105-9 119-14 20-82 22z m830-787v36q0 8-5 13t-13 5h-821q-8 0-13-5t-5-13v-36q0-8 5-13t13-5h821q8 0 13 5t5 13z" horiz-adv-x="857.1" />
<glyph glyph-name="table" unicode="&#xf0ce;" d="M286 82v107q0 8-5 13t-13 5h-179q-7 0-12-5t-6-13v-107q0-8 6-13t12-5h179q8 0 13 5t5 13z m0 214v108q0 7-5 12t-13 5h-179q-7 0-12-5t-6-12v-108q0-7 6-12t12-5h179q8 0 13 5t5 12z m285-214v107q0 8-5 13t-12 5h-179q-8 0-13-5t-5-13v-107q0-8 5-13t13-5h179q7 0 12 5t5 13z m-285 429v107q0 8-5 13t-13 5h-179q-7 0-12-5t-6-13v-107q0-8 6-13t12-5h179q8 0 13 5t5 13z m285-215v108q0 7-5 12t-12 5h-179q-8 0-13-5t-5-12v-108q0-7 5-12t13-5h179q7 0 12 5t5 12z m286-214v107q0 8-5 13t-13 5h-178q-8 0-13-5t-5-13v-107q0-8 5-13t13-5h178q8 0 13 5t5 13z m-286 429v107q0 8-5 13t-12 5h-179q-8 0-13-5t-5-13v-107q0-8 5-13t13-5h179q7 0 12 5t5 13z m286-215v108q0 7-5 12t-13 5h-178q-8 0-13-5t-5-12v-108q0-7 5-12t13-5h178q8 0 13 5t5 12z m0 215v107q0 8-5 13t-13 5h-178q-8 0-13-5t-5-13v-107q0-8 5-13t13-5h178q8 0 13 5t5 13z m72 178v-607q0-37-27-63t-63-26h-750q-36 0-63 26t-26 63v607q0 37 26 63t63 27h750q37 0 63-27t27-63z" horiz-adv-x="928.6" />
<glyph glyph-name="columns" unicode="&#xf0db;" d="M89-7h340v643h-358v-625q0-7 6-13t12-5z m768 18v625h-357v-643h339q8 0 13 5t5 13z m72 678v-678q0-37-27-63t-63-27h-750q-36 0-63 27t-26 63v678q0 37 26 63t63 27h750q37 0 63-27t27-63z" horiz-adv-x="928.6" />
<glyph glyph-name="quote-left" unicode="&#xf10d;" d="M429 314v-214q0-45-32-76t-76-31h-214q-44 0-76 31t-31 76v393q0 58 23 111t61 91 91 61 111 23h35q15 0 26-11t10-25v-72q0-14-10-25t-26-10h-35q-59 0-101-42t-42-101v-18q0-22 16-38t37-16h125q45 0 76-31t32-76z m500 0v-214q0-45-32-76t-76-31h-214q-44 0-76 31t-31 76v393q0 58 23 111t61 91 91 61 111 23h35q15 0 26-11t10-25v-72q0-14-10-25t-26-10h-35q-59 0-101-42t-42-101v-18q0-22 16-38t37-16h125q45 0 76-31t32-76z" horiz-adv-x="928.6" />
<glyph glyph-name="code" unicode="&#xf121;" d="M344 69l-28-28q-5-5-12-5t-13 5l-260 261q-6 5-6 12t6 13l260 260q5 6 13 6t12-6l28-28q6-5 6-13t-6-12l-219-220 219-219q6-6 6-13t-6-13z m330 596l-208-721q-2-7-9-11t-13-1l-34 9q-8 3-11 9t-2 14l209 720q2 8 8 11t13 2l35-10q7-2 11-9t1-13z m367-363l-260-261q-6-5-13-5t-13 5l-28 28q-5 6-5 13t5 13l219 219-219 220q-5 5-5 12t5 13l28 28q6 6 13 6t13-6l260-260q5-5 5-13t-5-12z" horiz-adv-x="1071.4" />
<glyph glyph-name="superscript" unicode="&#xf12b;" d="M501 86v-93h-139l-89 141-13 23q-4 5-6 12h-2q0-2-1-4t-2-4-2-4q-5-11-14-25l-86-139h-144v93h71l110 162-103 152h-76v94h154l77-127q1-2 13-24 4-5 6-11h2q1 5 6 11l14 24 78 127h143v-94h-69l-103-149 114-165h61z m355 379v-115h-287l-1 15q-3 16-3 26 0 36 15 65t36 48 47 37 47 30 36 30 15 36q0 21-17 35t-39 13q-29 0-54-21-8-6-20-22l-59 52q15 20 35 37 47 36 105 36 61 0 99-33t38-89q0-31-13-57t-35-43-45-33-46-28-37-28-17-36h130v45h70z" horiz-adv-x="857.1" />
<glyph glyph-name="subscript" unicode="&#xf12c;" d="M501 86v-93h-139l-89 141-13 23q-4 5-6 12h-2q0-2-1-4t-2-4-2-4q-5-11-14-25l-86-139h-144v93h71l110 162-103 152h-76v94h154l77-127q1-2 13-24 4-5 6-11h2q1 5 6 11l14 24 78 127h143v-94h-69l-103-149 114-165h61z m356-121v-115h-287l-2 15q-2 25-2 26 0 35 15 65t36 48 47 37 47 30 36 30 15 36q0 21-17 35t-39 13q-28 0-54-21-8-6-20-22l-59 52q15 20 35 37 45 36 105 36 62 0 100-33t37-89q0-37-19-66t-47-48-55-35-49-35-23-41h130v45h70z" horiz-adv-x="857.1" />
<glyph glyph-name="header" unicode="&#xf1dc;" d="M939-79q-25 0-74 2t-75 2q-24 0-73-2t-74-2q-13 0-21 12t-7 25q0 18 9 26t22 9 29 4 25 9q18 11 18 78l0 218q0 12-1 17-7 3-28 3h-376q-22 0-29-3 0-5 0-17l-1-207q0-79 21-91 9-6 26-8t32-2 25-8 11-26q0-14-6-26t-21-13q-26 0-78 2t-77 2q-24 0-71-2t-71-2q-13 0-20 12t-7 25q0 17 9 25t20 10 26 4 24 9q18 13 18 80l-1 31v454q0 2 1 15t0 20-1 21-2 24-4 20-6 18-9 10q-8 5-25 7t-29 1-23 7-10 26q0 14 6 26t20 13q26 0 78-2t77-2q23 0 71 2t70 2q14 0 21-13t7-26q0-17-9-25t-22-8-27-2-24-7q-20-12-20-90l1-178q0-12 0-18 7-2 22-2h390q14 0 21 2 1 6 1 18l0 178q0 78-19 90-10 6-33 7t-37 7-14 28q0 14 7 26t21 13q24 0 74-2t73-2q24 0 72 2t72 2q14 0 21-13t7-26q0-17-10-25t-22-8-29-2-24-7q-20-13-20-90l1-526q0-66 19-78 9-6 25-8t30-2 23-9 10-25q0-14-6-26t-20-13z" horiz-adv-x="1000" />
<glyph glyph-name="window-maximize" unicode="&#xf2d0;" d="M143 64h714v429h-714v-429z m857 625v-678q0-37-26-63t-63-27h-822q-36 0-63 27t-26 63v678q0 37 26 63t63 27h822q37 0 63-27t26-63z" horiz-adv-x="1000" />
</font>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 16 KiB

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{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};

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,16 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-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.5fd30069.js"></script>
<link rel="modulepreload" href="assets/vendor.6399378c.js">
<link rel="stylesheet" href="assets/style.9e577f5e.css">
</head>
<body>
<div id="app"></div>
</body>
</html>

View File

@@ -0,0 +1,8 @@
# zyplayer-doc-core
#### 项目介绍
整个项目的公用模块
模块的详细使用文档地址,部署必看:
http://doc.zyplayer.com

View File

@@ -3,24 +3,43 @@
xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<artifactId>zyplayer-doc-core</artifactId>
<parent>
<groupId>com.zyplayer</groupId>
<artifactId>zyplayer-doc</artifactId>
<version>1.0.0</version>
</parent>
<artifactId>zyplayer-doc-core</artifactId>
<version>1.0.0</version>
<name>zyplayer-doc-core</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</dependency>
<dependency>
<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,18 @@
package com.zyplayer.doc.core.annotation;
import java.lang.annotation.*;
/**
* 用户登录校验注解
*
* @author 暮光:城中城
* @since 2019年5月29日
*/
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface AuthMan {
String[] value() default {};
boolean all() default false;
}

View File

@@ -1,5 +0,0 @@
package com.zyplayer.doc.core.bean.swagger;
public class Contact {
}

View File

@@ -1,42 +0,0 @@
package com.zyplayer.doc.core.bean.swagger;
public class Info {
private String description;
private String version;
private String title;
private Contact contact;
public void setDescription(String description) {
this.description = description;
}
public String getDescription() {
return description;
}
public void setVersion(String version) {
this.version = version;
}
public String getVersion() {
return version;
}
public void setTitle(String title) {
this.title = title;
}
public String getTitle() {
return title;
}
public void setContact(Contact contact) {
this.contact = contact;
}
public Contact getContact() {
return contact;
}
}

View File

@@ -1,5 +0,0 @@
package com.zyplayer.doc.core.bean.swagger;
public class Paths {
}

View File

@@ -1,62 +0,0 @@
package com.zyplayer.doc.core.bean.swagger;
import java.util.List;
public class SwaggerApiDocs {
private String swagger;
private Info info;
private String host;
private String basePath;
private List<String> tags;
private Paths paths;
public void setSwagger(String swagger) {
this.swagger = swagger;
}
public String getSwagger() {
return swagger;
}
public void setInfo(Info info) {
this.info = info;
}
public Info getInfo() {
return info;
}
public void setHost(String host) {
this.host = host;
}
public String getHost() {
return host;
}
public void setBasePath(String basePath) {
this.basePath = basePath;
}
public String getBasePath() {
return basePath;
}
public void setTags(List<String> tags) {
this.tags = tags;
}
public List<String> getTags() {
return tags;
}
public void setPaths(Paths paths) {
this.paths = paths;
}
public Paths getPaths() {
return paths;
}
}

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 Integer source;
@Getter
private String desc;
PageFileSource(Integer source, String desc) {
this.source = source;
this.desc = desc;
}
}

View File

@@ -0,0 +1,39 @@
package com.zyplayer.doc.core.enums;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.Stream;
/**
* 系统配置枚举
*
* @author 暮光:城中城
* @since 2022-10-20
*/
public enum SystemConfigEnum {
// 系统相关
DOC_SYSTEM_VERSION("doc_system_version", "系统当前的版本号"),
;
private String key;
private String desc;
SystemConfigEnum(String key, String desc) {
this.key = key;
this.desc = desc;
}
private static final Map<String, SystemConfigEnum> VALUE_MAP = Stream.of(values()).collect(Collectors.toMap(SystemConfigEnum::getKey, (treeType) -> treeType));
public static SystemConfigEnum get(String code) {
return VALUE_MAP.get(code);
}
public String getKey() {
return key;
}
public String getDesc() {
return desc;
}
}

View File

@@ -2,29 +2,32 @@ package com.zyplayer.doc.core.exception;
/**
* 前端提示异常
*
* @author 暮光:城中城
* @since 2018年12月8日
*/
public class ConfirmException extends RuntimeException {
private static final long serialVersionUID = -7084066605197111614L;
public ConfirmException() {
super();
}
public ConfirmException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
super(message, cause, enableSuppression, writableStackTrace);
}
public ConfirmException(String message, Throwable cause) {
super(message, cause);
}
public ConfirmException(String message) {
super(message);
}
public ConfirmException(Throwable cause) {
super(cause);
}
}

View File

@@ -1,153 +1,215 @@
package com.zyplayer.doc.core.json;
import java.io.IOException;
import java.util.Date;
import javax.servlet.http.HttpServletResponse;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.SerializeConfig;
import com.alibaba.fastjson.serializer.SimpleDateFormatSerializer;
import io.swagger.annotations.ApiModelProperty;
/**
* 文档返回数据格式
*
* @author 暮光:城中城
* @since 2018年8月21日
*/
public class DocResponseJson<T> implements ResponseJson<T> {
private static SerializeConfig mapping = new SerializeConfig();
static {
mapping.put(Date.class, new SimpleDateFormatSerializer("yyyy-MM-dd HH:mm:ss"));
}
@ApiModelProperty(value = "状态码")
private Integer errCode;
@ApiModelProperty(value = "返回值说明")
private String errMsg;
@ApiModelProperty(value = "返回数据")
private T data;
public DocResponseJson() {
this.errCode = 200;
}
public DocResponseJson(T data) {
this.setData(data);
this.errCode = 200;
}
public DocResponseJson(int errCode, String errMsg) {
super();
this.errCode = errCode;
this.errMsg = errMsg;
}
public DocResponseJson(int errCode, String errMsg, T data) {
super();
this.setData(data);
this.errCode = errCode;
this.errMsg = errMsg;
}
public DocResponseJson(Integer errCode) {
super();
this.errCode = errCode;
}
public Integer getErrCode() {
return errCode;
}
public void setErrCode(Integer errCode) {
this.errCode = errCode;
}
public String getErrMsg() {
return errMsg;
}
public void setErrMsg(String errMsg) {
this.errMsg = errMsg;
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
/**
* 提示语
*
* @author 暮光:城中城
* @since 2018年8月7日
* @return
*/
public static <T> DocResponseJson<T> warn(String errMsg) {
return new DocResponseJson<T>(300, errMsg);
}
/**
* 错误
*
* @author 暮光:城中城
* @since 2018年8月7日
* @return
*/
public static <T> DocResponseJson<T> error(String errMsg) {
return new DocResponseJson<T>(500, errMsg);
}
/**
* 成功的返回方法
*
* @author 暮光:城中城
* @since 2018年8月7日
* @return
*/
public static <T> DocResponseJson<T> ok() {
return new DocResponseJson<T>();
}
/**
* 成功的返回方法
*
* @author 暮光:城中城
* @since 2018年8月7日
* @return
*/
public static <T> DocResponseJson<T> ok(T data) {
if (data == null) {
return DocResponseJson.ok();
}
DocResponseJson<T> responseJson = new DocResponseJson<T>();
responseJson.setData(data);
return responseJson;
}
public String toJson() {
return JSON.toJSONString(this, mapping);
}
public void send(HttpServletResponse response) {
try {
response.setStatus(200);
response.setContentType("application/json");
response.setCharacterEncoding("UTF-8");
response.setHeader("Cache-Control", "no-cache, must-revalidate");
response.getWriter().write(toJson());
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public String toString() {
return "DefaultResponseJson [errCode=" + errCode + ", errMsg=" + errMsg + ", data=" + data + "]";
}
}
package com.zyplayer.doc.core.json;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.annotation.JSONField;
import com.alibaba.fastjson.serializer.SerializeConfig;
import com.alibaba.fastjson.serializer.SimpleDateFormatSerializer;
import com.baomidou.mybatisplus.core.metadata.IPage;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Date;
import java.util.Objects;
/**
* 文档返回数据格式
*
* @author 暮光:城中城
* @since 2018年8月21日
*/
public class DocResponseJson<T> implements ResponseJson<T> {
private static SerializeConfig mapping = new SerializeConfig();
static {
mapping.put(Date.class, new SimpleDateFormatSerializer("yyyy-MM-dd HH:mm:ss"));
}
private Integer errCode;
private String errMsg;
private Object data;
private Long total;
private Integer pageNum;
private Integer pageSize;
private Integer totalPage;
public DocResponseJson() {
this.errCode = 200;
}
public DocResponseJson(Object data) {
this.setData(data);
this.errCode = 200;
}
public DocResponseJson(int errCode, String errMsg) {
super();
this.errCode = errCode;
this.errMsg = errMsg;
}
public DocResponseJson(int errCode, String errMsg, Object data) {
super();
this.setData(data);
this.errCode = errCode;
this.errMsg = errMsg;
}
public DocResponseJson(Integer errCode) {
super();
this.errCode = errCode;
}
public Integer getErrCode() {
return errCode;
}
public void setErrCode(Integer errCode) {
this.errCode = errCode;
}
public String getErrMsg() {
return errMsg;
}
public void setErrMsg(String errMsg) {
this.errMsg = errMsg;
}
public Long getTotal() {
return total;
}
public void setTotal(Long total) {
this.total = total;
}
public Integer getPageNum() {
return pageNum;
}
public void setPageNum(Integer pageNum) {
this.pageNum = pageNum;
}
public Integer getPageSize() {
return pageSize;
}
public void setPageSize(Integer pageSize) {
this.pageSize = pageSize;
}
public Integer getTotalPage() {
return totalPage;
}
public void setTotalPage(Integer totalPage) {
this.totalPage = totalPage;
}
public Object getData() {
return data;
}
public void setData(Object data) {
if (null != data) {
if (data instanceof IPage) {
IPage<?> iPage = (IPage<?>) data;
this.data = iPage.getRecords();
this.total = iPage.getTotal();
this.pageNum = (int) iPage.getCurrent();
this.pageSize = (int) iPage.getSize();
this.totalPage = (int) iPage.getPages();
} else {
this.data = data;
}
}
}
/**
* 提示语
*
* @return
* @author 暮光:城中城
* @since 2018年8月7日
*/
public static <T> DocResponseJson<T> warn(String errMsg) {
return new DocResponseJson<T>(300, errMsg);
}
/**
* 错误
*
* @return
* @author 暮光:城中城
* @since 2018年8月7日
*/
public static <T> DocResponseJson<T> error(String errMsg) {
return new DocResponseJson<T>(500, errMsg);
}
/**
* 失败
*
* @return
* @author 暮光:城中城
* @since 2018年8月7日
*/
public static <T> DocResponseJson<T> failure(int errCode, String errMsg) {
return new DocResponseJson<T>(errCode, errMsg);
}
/**
* 成功的返回方法
*
* @return
* @author 暮光:城中城
* @since 2018年8月7日
*/
public static <T> DocResponseJson<T> ok() {
return new DocResponseJson<>();
}
/**
* 成功的返回方法
*
* @return
* @author 暮光:城中城
* @since 2018年8月7日
*/
public static <T> DocResponseJson<T> ok(Object data) {
if (data == null) {
return DocResponseJson.ok();
}
DocResponseJson<T> responseJson = new DocResponseJson<>();
responseJson.setData(data);
return responseJson;
}
public String toJson() {
return JSON.toJSONString(this, mapping);
}
public void send(HttpServletResponse response) {
try {
response.setStatus(200);
response.setContentType("application/json");
response.setCharacterEncoding("UTF-8");
response.setHeader("Cache-Control", "no-cache, must-revalidate");
response.getWriter().write(toJson());
} catch (IOException e) {
e.printStackTrace();
}
}
@JSONField(serialize = false)
public boolean isOk() {
return Objects.equals(this.errCode, 200);
}
@Override
public String toString() {
return "DefaultResponseJson [errCode=" + errCode + ", errMsg=" + errMsg + ", data=" + data + "]";
}
}

View File

@@ -0,0 +1,18 @@
package com.zyplayer.doc.core.json;
/**
* http静态资源定义
*
* @author 暮光:城中城
* @since 2019年05月29日
*/
public class HttpConst {
/**
* 会话连接
*/
public static final String ACCESS_TOKEN = "accessToken";
/**
* accessToken非法或过期需要重新登录
**/
public static final int TOKEN_TIMEOUT = 400;
}

View File

@@ -2,7 +2,7 @@ package com.zyplayer.doc.core.json;
/**
* json视图
*
*
* @author 暮光:城中城
* @since 2018年8月21日
*/

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

@@ -0,0 +1,25 @@
package com.zyplayer.doc.core.util;
import java.util.LinkedList;
import java.util.List;
/**
* zyplayer-doc版本号
*
* @author 暮光:城中城
* @since 2021-06-06
*/
public class ZyplayerDocVersion {
public static final String version = "1.1.6";
/**
* 每次升级必须添加一条记录用于执行它的升级SQL
*/
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

@@ -0,0 +1,8 @@
# zyplayer-doc-data
#### 项目介绍
整个项目的数据核心,操作数据库、登录拦截、权限拦截等
模块的详细使用文档地址,部署必看:
http://doc.zyplayer.com

117
zyplayer-doc-data/pom.xml Normal file
View File

@@ -0,0 +1,117 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<artifactId>zyplayer-doc-data</artifactId>
<parent>
<groupId>com.zyplayer</groupId>
<artifactId>zyplayer-doc</artifactId>
<version>1.0.0</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>commons-collections</groupId>
<artifactId>commons-collections</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
</dependency>
<!-- 数据库驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- <dependency>-->
<!-- <groupId>com.oracle</groupId>-->
<!-- <artifactId>ojdbc6</artifactId>-->
<!-- </dependency>-->
<!--达梦数据库驱动-->
<dependency>
<groupId>com.dameng</groupId>
<artifactId>DmJdbcDriver18</artifactId>
</dependency>
<dependency>
<groupId>net.sourceforge.jtds</groupId>
<artifactId>jtds</artifactId>
</dependency>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
</dependency>
<!-- 按需开启对hive的支持它依赖的包实在太多太大了-->
<!-- <dependency>-->
<!-- <groupId>org.apache.hive</groupId>-->
<!-- <artifactId>hive-jdbc</artifactId>-->
<!-- <version>2.1.1</version>-->
<!-- <exclusions>-->
<!-- <exclusion>-->
<!-- <artifactId>commons-logging</artifactId>-->
<!-- <groupId>commons-logging</groupId>-->
<!-- </exclusion>-->
<!-- <exclusion>-->
<!-- <artifactId>log4j</artifactId>-->
<!-- <groupId>log4j</groupId>-->
<!-- </exclusion>-->
<!-- <exclusion>-->
<!-- <artifactId>log4j-1.2-api</artifactId>-->
<!-- <groupId>org.apache.logging.log4j</groupId>-->
<!-- </exclusion>-->
<!-- <exclusion>-->
<!-- <artifactId>log4j-slf4j-impl</artifactId>-->
<!-- <groupId>org.apache.logging.log4j</groupId>-->
<!-- </exclusion>-->
<!-- <exclusion>-->
<!-- <artifactId>log4j-web</artifactId>-->
<!-- <groupId>org.apache.logging.log4j</groupId>-->
<!-- </exclusion>-->
<!-- <exclusion>-->
<!-- <artifactId>slf4j-log4j12</artifactId>-->
<!-- <groupId>org.slf4j</groupId>-->
<!-- </exclusion>-->
<!-- </exclusions>-->
<!-- </dependency>-->
<dependency>
<groupId>com.zyplayer</groupId>
<artifactId>zyplayer-doc-core</artifactId>
</dependency>
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
</project>

View File

@@ -0,0 +1,69 @@
package com.zyplayer.doc.data.config;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
import com.zyplayer.doc.data.repository.support.interceptor.SqlLogInterceptor;
import com.zyplayer.doc.data.utils.DruidDataSourceUtil;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Value;
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 javax.annotation.Resource;
import javax.sql.DataSource;
/**
* mybatis plus数据库配置
*
* @author 暮光:城中城
* @since 2019-02-16
*/
@Configuration
public class MybatisPlusConfig {
/**
* 数据库配置
*/
@Configuration
@EnableTransactionManagement
@MapperScan(value = "com.zyplayer.doc.data.repository.manage.mapper", sqlSessionFactoryRef = "manageSqlSessionFactory")
static class ManageMybatisDbConfig {
@Value("${zyplayer.doc.manage.datasource.driverClassName}")
private String driverClassName;
@Value("${zyplayer.doc.manage.datasource.url}")
private String url;
@Value("${zyplayer.doc.manage.datasource.username}")
private String username;
@Value("${zyplayer.doc.manage.datasource.password}")
private String password;
@Resource
private MybatisPlusInterceptor paginationInterceptor;
@Bean(name = "manageDatasource")
public DataSource manageDatasource() throws Exception {
return DruidDataSourceUtil.createDataSource(driverClassName, url, username, password, false);
}
@Bean(name = "manageSqlSessionFactory")
public MybatisSqlSessionFactoryBean manageSqlSessionFactory() throws Exception {
MybatisSqlSessionFactoryBean sqlSessionFactoryBean = new MybatisSqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(manageDatasource());
sqlSessionFactoryBean.setPlugins(new SqlLogInterceptor(), paginationInterceptor);
PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
sqlSessionFactoryBean.setMapperLocations(resolver.getResources("classpath:/mapper/manage/*Mapper.xml"));
return sqlSessionFactoryBean;
}
}
@Bean
public MybatisPlusInterceptor paginationInterceptor() {
MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor());
return mybatisPlusInterceptor;
}
}

View File

@@ -0,0 +1,42 @@
package com.zyplayer.doc.data.config.security;
import lombok.Data;
import java.util.List;
/**
* 登录用户信息
*
* @author 暮光:城中城
* @since 2018-12-02
*/
@Data
public class DocUserDetails {
private Long userId;
private String username;
private String password;
private boolean enabled;
private List<UserAuthInfo> userAuthList;
public DocUserDetails(Long userId, String username) {
this.userId = userId;
this.username = username;
}
public DocUserDetails(Long userId, String username, String password, boolean enabled) {
super();
this.userId = userId;
this.username = username;
this.password = password;
this.enabled = enabled;
}
public DocUserDetails(Long userId, String username, String password, boolean enabled, List<UserAuthInfo> userAuthList) {
super();
this.userId = userId;
this.username = username;
this.password = password;
this.enabled = enabled;
this.userAuthList = userAuthList;
}
}

View File

@@ -0,0 +1,102 @@
package com.zyplayer.doc.data.config.security;
import com.zyplayer.doc.data.utils.CachePrefix;
import com.zyplayer.doc.data.utils.CacheUtil;
import java.util.List;
import java.util.Objects;
import java.util.Set;
import java.util.stream.Collectors;
/**
* 用户工具类
*
* @author 暮光:城中城
* @since 2019年05月25日
*/
public class DocUserUtil {
private static final ThreadLocal<DocUserDetails> DOC_USER_DETAILS = new ThreadLocal<>();
private static final ThreadLocal<String> ACCESS_TOKEN = new ThreadLocal<>();
public static void setAccessToken(String accessToken) {
DocUserUtil.ACCESS_TOKEN.set(accessToken);
}
public static boolean haveCustomAuth(String authName, Integer sysType, Integer sysModuleType, Long sysModuleId) {
DocUserDetails currentUser = getCurrentUser();
if (currentUser == null) {
return false;
}
return currentUser.getUserAuthList().stream().anyMatch(auth ->
Objects.equals(auth.getAuthCode(), authName)
&& Objects.equals(auth.getSysType(), sysType)
&& Objects.equals(auth.getSysModuleType(), sysModuleType)
&& Objects.equals(auth.getSysModuleId(), sysModuleId)
);
}
public static boolean haveAuth(String... authNames) {
DocUserDetails currentUser = getCurrentUser();
if (currentUser == null) {
return false;
}
Set<String> authCodeSet = currentUser.getUserAuthList().stream().map(UserAuthInfo::getAuthCode).collect(Collectors.toSet());
for (String authName : authNames) {
if (!authCodeSet.contains(authName)) {
return false;
}
}
return true;
}
/**
* 获取当前用户
*
* @return 用户信息
*/
public static DocUserDetails getCurrentUser() {
DocUserDetails docUser = DOC_USER_DETAILS.get();
if (docUser == null) {
docUser = CacheUtil.get(ACCESS_TOKEN.get());
if (docUser != null) {
DOC_USER_DETAILS.set(docUser);
}
}
return docUser;
}
/**
* 设置当前用户
*/
public static void setCurrentUser(String accessToken, DocUserDetails docUser) {
DOC_USER_DETAILS.set(docUser);
CacheUtil.put(accessToken, docUser);
CacheUtil.put(CachePrefix.LOGIN_USER_ID_TOKEN + docUser.getUserId(), accessToken);
}
/**
* 设置当前用户权限
*/
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);
if (docUser != null) {
docUser.setUserAuthList(userAuthList);
CacheUtil.put(userToken, docUser);
}
}
}
/**
* 退出登录
*/
public static void logout() {
CacheUtil.remove(ACCESS_TOKEN.get());
}
public static void clean() {
DocUserUtil.DOC_USER_DETAILS.remove();
DocUserUtil.ACCESS_TOKEN.remove();
}
}

View File

@@ -0,0 +1,56 @@
package com.zyplayer.doc.data.config.security;
import com.zyplayer.doc.data.repository.manage.entity.UserAuth;
import com.zyplayer.doc.data.repository.support.consts.DocSysModuleType;
import com.zyplayer.doc.data.repository.support.consts.DocSysType;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* <p>
* 用户权限表
* </p>
*
* @author 暮光:城中城
* @since 2019-05-31
*/
@Data
@NoArgsConstructor
public class UserAuthInfo implements Serializable {
private static final long serialVersionUID = 1L;
public UserAuthInfo(UserAuth userAuth) {
this.authId = userAuth.getAuthId();
this.sysType = userAuth.getSysType();
this.sysModuleType = userAuth.getSysModuleType();
this.sysModuleId = userAuth.getSysModuleId();
}
/**
* 权限ID
*/
private Long authId;
/**
* 权限code
*/
private String authCode;
/**
* 系统类型,{@link DocSysType}
*/
private Integer sysType;
/**
* 系统模块类型,{@link DocSysModuleType}
*/
private Integer sysModuleType;
/**
* 系统模块ID
*/
private Long sysModuleId;
}

View File

@@ -0,0 +1,78 @@
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 暮光:城中城
* @since 2022-01-29
*/
@Data
@TableName("api_custom_node")
public class ApiCustomNode implements Serializable {
/**
* 主键自增ID
*/
@TableId(value = "id", type = IdType.AUTO)
private Long id;
/**
* api_doc主键ID
*/
private Long docId;
/**
* 父文件夹ID
*/
private Long parentId;
/**
* 节点类型 0=目录 1=接口
*/
private Integer nodeType;
/**
* 节点名称
*/
private String nodeName;
/**
* 节点说明
*/
private String nodeDesc;
/**
* 节点顺序
*/
private Integer seqNo;
/**
* 创建人ID
*/
private Long createUserId;
/**
* 创建人名字
*/
private String createUserName;
/**
* 创建时间
*/
private Date createTime;
/**
* 是否有效 0=无效 1=有效
*/
private Integer yn;
}

View File

@@ -0,0 +1,88 @@
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 暮光:城中城
* @since 2022-01-29
*/
@Data
@TableName("api_custom_params")
public class ApiCustomParams implements Serializable {
/**
* 主键自增ID
*/
@TableId(value = "id", type = IdType.AUTO)
private Long id;
/**
* api_doc主键ID
*/
private Long docId;
/**
* 节点ID
*/
private Long nodeId;
/**
* 请求方式get、head、post、put、patch、delete、options、trace
*/
private String method;
/**
* 接口url
*/
private String apiUrl;
/**
* form参数
*/
private String formData;
/**
* body参数
*/
private String bodyData;
/**
* header参数
*/
private String headerData;
/**
* cookie参数
*/
private String cookieData;
/**
* 创建人ID
*/
private Long createUserId;
/**
* 创建人名字
*/
private String createUserName;
/**
* 创建时间
*/
private Date createTime;
/**
* 是否有效 0=无效 1=有效
*/
private Integer yn;
}

View File

@@ -0,0 +1,93 @@
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>
* api文档地址
* </p>
*
* @author 暮光:城中城
* @since 2021-11-25
*/
@Data
@TableName("api_doc")
public class ApiDoc implements Serializable {
/**
* 主键自增ID
*/
@TableId(value = "id", type = IdType.AUTO)
private Long id;
/**
* 文档名称
*/
private String name;
/**
* 文档类型 1=swagger url 2=swagger json 3=openapi url 4=openapi json 5=自建API分组
*/
private Integer docType;
/**
* 文档URL地址
*/
private String docUrl;
/**
* 文档json内容
*/
private String jsonContent;
/**
* 重写的域名
*/
private String rewriteDomain;
/**
* 是否开放访问 0=否 1=是
*/
private Integer openVisit;
/**
* 状态 1=启用 2=禁用
*/
private Integer docStatus;
/**
* 开放文档UUID
*/
private String shareUuid;
/**
* 开放文档使用说明
*/
private String shareInstruction;
/**
* 创建人ID
*/
private Long createUserId;
/**
* 创建人名字
*/
private String createUserName;
/**
* 创建时间
*/
private Date createTime;
/**
* 是否有效 0=无效 1=有效
*/
private Integer yn;
}

View File

@@ -0,0 +1,73 @@
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>
* api文档全局参数记录
* </p>
*
* @author 暮光:城中城
* @since 2021-11-25
*/
@Data
@TableName("api_global_param")
public class ApiGlobalParam implements Serializable {
/**
* 主键自增ID
*/
@TableId(value = "id", type = IdType.AUTO)
private Long id;
/**
* api_doc主键ID
*/
private Long docId;
/**
* 参数类型 1=form 2=header 3=cookie
*/
private Integer paramType;
/**
* 参数名
*/
private String paramKey;
/**
* 参数值
*/
private String paramValue;
/**
* 状态 1=启用 2=禁用
*/
private Integer paramStatus;
/**
* 创建人ID
*/
private Long createUserId;
/**
* 创建人名字
*/
private String createUserName;
/**
* 创建时间
*/
private Date createTime;
/**
* 是否有效 0=无效 1=有效
*/
private Integer yn;
}

View File

@@ -0,0 +1,78 @@
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 暮光:城中城
* @since 2021-11-25
*/
@Data
@TableName("api_request_param")
public class ApiRequestParam implements Serializable {
/**
* 主键自增ID
*/
@TableId(value = "id", type = IdType.AUTO)
private Long id;
/**
* api_doc主键ID
*/
private Long docId;
/**
* 文档url
*/
private String docUrl;
/**
* form参数
*/
private String formData;
/**
* body参数
*/
private String bodyData;
/**
* header参数
*/
private String headerData;
/**
* cookie参数
*/
private String cookieData;
/**
* 创建人ID
*/
private Long createUserId;
/**
* 创建人名字
*/
private String createUserName;
/**
* 创建时间
*/
private Date createTime;
/**
* 是否有效 0=无效 1=有效
*/
private Integer yn;
}

View File

@@ -0,0 +1,53 @@
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 暮光:城中城
* @since 2018-12-05
*/
@Data
@TableName("auth_info")
public class AuthInfo implements Serializable {
/**
* 主键自增ID
*/
@TableId(value = "id", type = IdType.AUTO)
private Long id;
/**
* 权限名
*/
private String authName;
/**
* 权限说明
*/
private String authDesc;
/**
* 是否可编辑 0=否 1=是
*/
private Integer canEdit;
/**
* 创建人
*/
private Long createUid;
/**
* 创建时间
*/
private Date creationTime;
}

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

@@ -0,0 +1,76 @@
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;
/**
* 数据源对象
*
* @author 暮光:城中城
* @since 2019-07-04
*/
@Data
@TableName("db_datasource")
public class DbDatasource implements Serializable {
/**
* 主键自增ID
*/
@TableId(value = "id", type = IdType.AUTO)
private Long id;
/**
* 数据源驱动类
*/
private String driverClassName;
/**
* 数据源地址
*/
private String sourceUrl;
/**
* 数据源用户名
*/
private String sourceName;
/**
* 数据源密码
*/
private String sourcePassword;
/**
* 创建人ID
*/
private Long createUserId;
/**
* 创建人名字
*/
private String createUserName;
/**
* 创建时间
*/
private Date createTime;
/**
* 是否有效 0=无效 1=有效
*/
private Integer yn;
/**
* 数据源名称
*/
private String name;
/**
* 数据源分组
*/
private String groupName;
}

View File

@@ -0,0 +1,68 @@
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 暮光:城中城
* @since 2019-08-21
*/
@Data
@TableName("db_favorite")
public class DbFavorite implements Serializable {
/**
* 主键自增ID
*/
@TableId(value = "id", type = IdType.AUTO)
private Long id;
/**
* 数据源ID
*/
private Long datasourceId;
/**
* 收藏标题
*/
private String name;
/**
* 收藏内容
*/
private String content;
/**
* 创建人ID
*/
private Long createUserId;
/**
* 创建人名字
*/
private String createUserName;
/**
* 创建时间
*/
private Date createTime;
/**
* 是否有效 0=无效 1=有效
*/
private Integer yn;
/**
* 执行参数JSON
*/
private String paramJson;
}

View File

@@ -0,0 +1,63 @@
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 暮光:城中城
* @since 2019-08-21
*/
@Data
@TableName("db_history")
public class DbHistory implements Serializable {
/**
* 主键自增ID
*/
@TableId(value = "id", type = IdType.AUTO)
private Long id;
/**
* 数据源ID
*/
private Long datasourceId;
/**
* sql内容
*/
private String content;
/**
* 创建人ID
*/
private Long createUserId;
/**
* 创建人名字
*/
private String createUserName;
/**
* 创建时间
*/
private Date createTime;
/**
* 是否有效 0=无效 1=有效
*/
private Integer yn;
/**
* 执行参数JSON
*/
private String paramJson;
}

View File

@@ -0,0 +1,73 @@
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 暮光:城中城
* @since 2021-04-26
*/
@Data
@TableName("db_proc_log")
public class DbProcLog implements Serializable {
/**
* 主键自增ID
*/
@TableId(value = "id", type = IdType.AUTO)
private Long id;
/**
* 数据源ID
*/
private Long datasourceId;
/**
* 所属数据库
*/
private String procDb;
/**
* 名字
*/
private String procName;
/**
* 类型
*/
private String procType;
/**
* 函数创建SQL
*/
private String procBody;
/**
* 保存状态 1=成功 2=失败
*/
private Integer status;
/**
* 创建人ID
*/
private Long createUserId;
/**
* 创建人名字
*/
private String createUserName;
/**
* 创建时间
*/
private Date createTime;
}

View File

@@ -0,0 +1,78 @@
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 暮光:城中城
* @since 2021-06-07
*/
@Data
@TableName("db_table_relation")
public class DbTableRelation implements Serializable {
/**
* 主键自增ID
*/
@TableId(value = "id", type = IdType.AUTO)
private Long id;
/**
* 数据源ID
*/
private Long datasourceId;
/**
* 源库名
*/
private String startDbName;
/**
* 源表名
*/
private String startTableName;
/**
* 源字段名
*/
private String startColumnName;
/**
* 目标库名
*/
private String endDbName;
/**
* 目标表名
*/
private String endTableName;
/**
* 目标字段名
*/
private String endColumnName;
/**
* 创建人ID
*/
private Long createUserId;
/**
* 创建人名字
*/
private String createUserName;
/**
* 创建时间
*/
private Date createTime;
}

View File

@@ -0,0 +1,93 @@
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 暮光:城中城
* @since 2019-09-30
*/
@Data
@TableName("db_transfer_task")
public class DbTransferTask implements Serializable {
/**
* 主键自增ID
*/
@TableId(value = "id", type = IdType.AUTO)
private Long id;
/**
* 任务名称
*/
private String name;
/**
* 查询数据源ID
*/
private Long queryDatasourceId;
/**
* 入库数据源ID
*/
private Long storageDatasourceId;
/**
* 查询数据的sql
*/
private String querySql;
/**
* 数据入库的sql
*/
private String storageSql;
/**
* 自动查询总条数 0=否 1=是
*/
private Integer needCount;
/**
* 最后执行状态 0=未执行 1=执行中 2=执行成功 3=执行失败 4=取消执行
*/
private Integer lastExecuteStatus;
/**
* 最后执行时间
*/
private Date lastExecuteTime;
/**
* 最后执行信息
*/
private String lastExecuteInfo;
/**
* 创建人ID
*/
private Long createUserId;
/**
* 创建人名字
*/
private String createUserName;
/**
* 创建时间
*/
private Date createTime;
/**
* 删除标记 0=正常 1=已删除
*/
private Integer delFlag;
}

View File

@@ -0,0 +1,153 @@
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 java.io.Serializable;
import java.util.Date;
/**
* <p>
* 系统配置表
* </p>
*
* @author 暮光:城中城
* @since 2022-12-01
*/
@TableName("system_config")
public class SystemConfig implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 主键自增ID
*/
@TableId(value = "id", type = IdType.AUTO)
private Long id;
/**
* 配置Key
*/
private String configKey;
/**
* 配置值
*/
private String configValue;
/**
* 创建时间
*/
private Date created;
/**
* 创建用户ID
*/
private Long createUserId;
/**
* 创建用户名字
*/
private String createUser;
/**
* 修改时间
*/
private Date modified;
/**
* 修改人ID
*/
private Long modifyUserId;
/**
* 修改人姓名
*/
private String modifyUser;
/**
* 是否有效 1=有效
*/
private Integer yn;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getConfigKey() {
return configKey;
}
public void setConfigKey(String configKey) {
this.configKey = configKey;
}
public String getConfigValue() {
return configValue;
}
public void setConfigValue(String configValue) {
this.configValue = configValue;
}
public Date getCreated() {
return created;
}
public void setCreated(Date created) {
this.created = created;
}
public Long getCreateUserId() {
return createUserId;
}
public void setCreateUserId(Long createUserId) {
this.createUserId = createUserId;
}
public String getCreateUser() {
return createUser;
}
public void setCreateUser(String createUser) {
this.createUser = createUser;
}
public Date getModified() {
return modified;
}
public void setModified(Date modified) {
this.modified = modified;
}
public Long getModifyUserId() {
return modifyUserId;
}
public void setModifyUserId(Long modifyUserId) {
this.modifyUserId = modifyUserId;
}
public String getModifyUser() {
return modifyUser;
}
public void setModifyUser(String modifyUser) {
this.modifyUser = modifyUser;
}
public Integer getYn() {
return yn;
}
public void setYn(Integer yn) {
this.yn = yn;
}
}

View File

@@ -0,0 +1,79 @@
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 暮光:城中城
* @since 2019-05-31
*/
@Data
@TableName("user_auth")
public class UserAuth implements Serializable {
/**
* 主键自增ID
*/
@TableId(value = "id", type = IdType.AUTO)
private Long id;
/**
* 用户ID
*/
private Long userId;
/**
* 权限ID
*/
private Long authId;
/**
* 创建用户ID
*/
private Long createUid;
/**
* 更新用户ID
*/
private Long updateUid;
/**
* 是否删除 0=未删除 1=已删除
*/
private Integer delFlag;
/**
* 创建时间
*/
private Date creationTime;
/**
* 更新时间
*/
private Date updateTime;
/**
* 系统类型DocSysType
*/
private Integer sysType;
/**
* 系统模块类型DocSysModuleType
*/
private Integer sysModuleType;
/**
* 系统模块ID
*/
private Long sysModuleId;
}

View File

@@ -0,0 +1,53 @@
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 暮光:城中城
* @since 2021-02-08
*/
@Data
@TableName("user_group")
public class UserGroup implements Serializable {
/**
* 主键自增ID
*/
@TableId(value = "id", type = IdType.AUTO)
private Long id;
/**
* 分组名
*/
private String name;
/**
* 创建人ID
*/
private Long createUserId;
/**
* 创建人名字
*/
private String createUserName;
/**
* 创建时间
*/
private Date createTime;
/**
* 删除标记 0=正常 1=已删除
*/
private Integer delFlag;
}

View File

@@ -0,0 +1,68 @@
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 暮光:城中城
* @since 2021-02-09
*/
@Data
@TableName("user_group_auth")
public class UserGroupAuth implements Serializable {
/**
* 主键自增ID
*/
@TableId(value = "id", type = IdType.AUTO)
private Long id;
/**
* 群ID
*/
private Long groupId;
/**
* 授权数据的ID
*/
private Long dataId;
/**
* 授权类型,依据各项目自己定义
*/
private Integer authType;
/**
* 项目类型 1=WIKI模块 2=数据库模块
*/
private Integer projectType;
/**
* 创建人ID
*/
private Long createUserId;
/**
* 创建人名字
*/
private String createUserName;
/**
* 创建时间
*/
private Date createTime;
/**
* 删除标记 0=正常 1=已删除
*/
private Integer delFlag;
}

View File

@@ -0,0 +1,58 @@
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 暮光:城中城
* @since 2021-02-08
*/
@Data
@TableName("user_group_relation")
public class UserGroupRelation implements Serializable {
/**
* 主键自增ID
*/
@TableId(value = "id", type = IdType.AUTO)
private Long id;
/**
* 群ID
*/
private Long groupId;
/**
* 用户ID
*/
private Long userId;
/**
* 创建人ID
*/
private Long createUserId;
/**
* 创建人名字
*/
private String createUserName;
/**
* 创建时间
*/
private Date createTime;
/**
* 删除标记 0=正常 1=已删除
*/
private Integer delFlag;
}

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