swagger文档增删改开发
This commit is contained in:
@@ -14,5 +14,5 @@ import java.util.List;
|
|||||||
* @since 2021-10-15
|
* @since 2021-10-15
|
||||||
*/
|
*/
|
||||||
public interface SwaggerDocService extends IService<SwaggerDoc> {
|
public interface SwaggerDocService extends IService<SwaggerDoc> {
|
||||||
public List<SwaggerDoc> getSwaggerDocList();
|
public List<SwaggerDoc> getSwaggerDocList(SwaggerDoc swaggerDoc);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,9 +21,12 @@ import java.util.List;
|
|||||||
public class SwaggerDocServiceImpl extends ServiceImpl<SwaggerDocMapper, SwaggerDoc> implements SwaggerDocService {
|
public class SwaggerDocServiceImpl extends ServiceImpl<SwaggerDocMapper, SwaggerDoc> implements SwaggerDocService {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<SwaggerDoc> getSwaggerDocList() {
|
public List<SwaggerDoc> getSwaggerDocList(SwaggerDoc swaggerDoc) {
|
||||||
QueryWrapper<SwaggerDoc> queryWrapper = new QueryWrapper<>();
|
QueryWrapper<SwaggerDoc> queryWrapper = new QueryWrapper<>();
|
||||||
queryWrapper.eq("yn", 1);
|
queryWrapper.eq("yn", 1);
|
||||||
|
queryWrapper.eq(swaggerDoc.getDocType() != null, "doc_type", swaggerDoc.getDocType());
|
||||||
|
queryWrapper.eq(swaggerDoc.getOpenVisit() != null, "open_visit", swaggerDoc.getOpenVisit());
|
||||||
|
queryWrapper.eq(swaggerDoc.getDocStatus() != null, "doc_status", swaggerDoc.getDocStatus());
|
||||||
return this.list(queryWrapper);
|
return this.list(queryWrapper);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -50,8 +50,8 @@ public class SwaggerDocumentController {
|
|||||||
*/
|
*/
|
||||||
@ResponseBody
|
@ResponseBody
|
||||||
@PostMapping(value = "/list")
|
@PostMapping(value = "/list")
|
||||||
public ResponseJson<List<SwaggerDoc>> list() {
|
public ResponseJson<List<SwaggerDoc>> list(SwaggerDoc swaggerDoc) {
|
||||||
List<SwaggerDoc> docList = swaggerDocService.getSwaggerDocList();
|
List<SwaggerDoc> docList = swaggerDocService.getSwaggerDocList(swaggerDoc);
|
||||||
return DocResponseJson.ok(docList);
|
return DocResponseJson.ok(docList);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ public class SwaggerProxyController {
|
|||||||
@RequestMapping("/swagger-resources")
|
@RequestMapping("/swagger-resources")
|
||||||
public List<SwaggerResource> swaggerResources() {
|
public List<SwaggerResource> swaggerResources() {
|
||||||
Set<SwaggerResource> resourceList = new HashSet<>();
|
Set<SwaggerResource> resourceList = new HashSet<>();
|
||||||
List<SwaggerDoc> docList = swaggerDocService.getSwaggerDocList();
|
List<SwaggerDoc> docList = swaggerDocService.getSwaggerDocList(new SwaggerDoc());
|
||||||
for (SwaggerDoc swaggerDoc : docList) {
|
for (SwaggerDoc swaggerDoc : docList) {
|
||||||
SwaggerResource resource = new SwaggerResource();
|
SwaggerResource resource = new SwaggerResource();
|
||||||
resource.setUrl("/doc-swagger/doc/content?id=" + swaggerDoc.getId());
|
resource.setUrl("/doc-swagger/doc/content?id=" + swaggerDoc.getId());
|
||||||
|
|||||||
@@ -4,5 +4,8 @@ export const zyplayerApi = {
|
|||||||
getSelfUserInfo: data => apiClient({url: '/user/info/selfInfo', method: 'post', data: data}),
|
getSelfUserInfo: data => apiClient({url: '/user/info/selfInfo', method: 'post', data: data}),
|
||||||
userLogout: data => apiClient({url: '/logout', method: 'post', data: data}),
|
userLogout: data => apiClient({url: '/logout', method: 'post', data: data}),
|
||||||
systemUpgradeInfo: data => apiClient({url: '/system/info/upgrade', method: 'post', data: data}),
|
systemUpgradeInfo: data => apiClient({url: '/system/info/upgrade', method: 'post', data: data}),
|
||||||
|
swaggerDocList: data => apiClient({url: '/doc-swagger/doc/list', method: 'post', data: data}),
|
||||||
|
swaggerDocAdd: data => apiClient({url: '/doc-swagger/doc/add', method: 'post', data: data}),
|
||||||
|
swaggerDocUpdate: data => apiClient({url: '/doc-swagger/doc/update', method: 'post', data: data}),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
<img src="../../assets/logo.png">
|
<img src="../../assets/logo.png">
|
||||||
<h1>swagger文档管理</h1>
|
<h1>swagger文档管理</h1>
|
||||||
</div>
|
</div>
|
||||||
<menu-layout></menu-layout>
|
<menu-layout :collapsed="appMenuCollapsed"></menu-layout>
|
||||||
</a-layout-sider>
|
</a-layout-sider>
|
||||||
<div ref="rightResize" class="right-resize" v-show="!appMenuCollapsed">
|
<div ref="rightResize" class="right-resize" v-show="!appMenuCollapsed">
|
||||||
<i ref="rightResizeBar">...</i>
|
<i ref="rightResizeBar">...</i>
|
||||||
|
|||||||
@@ -1,14 +1,17 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="menu-layout">
|
<div class="menu-layout">
|
||||||
<div style="padding: 10px 5px;">
|
<a-menu theme="light" mode="inline" :inline-collapsed="false" v-model:openKeys="openKeys" v-model:selectedKeys="selectedKeys">
|
||||||
<a-select placeholder="请选择分组" v-model:value="swaggerDocChoice" style="width: 100%;">
|
|
||||||
<a-select-option :value="item.url" v-for="item in swaggerResourceList">{{item.name}}</a-select-option>
|
|
||||||
</a-select>
|
|
||||||
</div>
|
|
||||||
<a-menu theme="light" mode="inline" :inline-collapsed="collapsed" v-model:openKeys="openKeys" v-model:selectedKeys="selectedKeys">
|
|
||||||
<menu-children-layout :menuItem="menuItem" v-for="menuItem in menuData"></menu-children-layout>
|
<menu-children-layout :menuItem="menuItem" v-for="menuItem in menuData"></menu-children-layout>
|
||||||
</a-menu>
|
</a-menu>
|
||||||
<a-directory-tree :tree-data="treeData" v-model:expandedKeys="expandedKeys" @select="docChecked"></a-directory-tree>
|
<a-divider style="margin: 6px 0;"/>
|
||||||
|
<div v-show="!collapsed">
|
||||||
|
<div style="padding: 10px 5px;">
|
||||||
|
<a-select placeholder="请选择分组" v-model:value="swaggerDocChoice" style="width: 100%;">
|
||||||
|
<a-select-option :value="item.url" v-for="item in swaggerResourceList">{{item.name}}</a-select-option>
|
||||||
|
</a-select>
|
||||||
|
</div>
|
||||||
|
<a-directory-tree :tree-data="treeData" v-model:expandedKeys="expandedKeys" @select="docChecked"></a-directory-tree>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
@@ -18,12 +21,17 @@
|
|||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'MenuLayout',
|
name: 'MenuLayout',
|
||||||
|
props: {
|
||||||
|
collapsed: {
|
||||||
|
type: Boolean,
|
||||||
|
default: false
|
||||||
|
},
|
||||||
|
},
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
menuData: [],
|
menuData: [],
|
||||||
selectedKeys: [],
|
selectedKeys: [],
|
||||||
openKeys: [],
|
openKeys: [],
|
||||||
collapsed: false,
|
|
||||||
// 文档树
|
// 文档树
|
||||||
treeData: [
|
treeData: [
|
||||||
{
|
{
|
||||||
@@ -49,6 +57,9 @@
|
|||||||
},
|
},
|
||||||
watch:{
|
watch:{
|
||||||
'$store.state.userInfo'(userInfo) {
|
'$store.state.userInfo'(userInfo) {
|
||||||
|
},
|
||||||
|
collapsed(x) {
|
||||||
|
console.log(x, this.collapsed)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
components: {MenuChildrenLayout},
|
components: {MenuChildrenLayout},
|
||||||
@@ -80,6 +91,8 @@
|
|||||||
if (this.swaggerResourceList.length > 0) {
|
if (this.swaggerResourceList.length > 0) {
|
||||||
this.swaggerDocChoice = this.swaggerResourceList[0].url;
|
this.swaggerDocChoice = this.swaggerResourceList[0].url;
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
this.$message.error('获取文档列表请求失败');
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,12 +1,14 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="page-layout">
|
<div class="page-layout">
|
||||||
<a-tabs type="card" v-model:activeKey="activePage" closable @tab-click="changePage" @edit="removePageTab" style="padding: 5px 10px 0;">
|
<a-tabs type="editable-card" hide-add v-model:activeKey="activePage" @tab-click="changePage" @edit="removePageTab" style="padding: 5px 10px 0;">
|
||||||
<a-tab-pane :tab="pageTabNameMap[item.fullPath]||item.name" :name="getRouteRealPath(item)" :fullPath="item.fullPath" :key="item.fullPath" v-for="item in pageList"/>
|
<a-tab-pane closable :tab="pageTabNameMap[item.fullPath]||item.name" :name="getRouteRealPath(item)" :fullPath="item.fullPath" :key="item.fullPath" v-for="item in pageList"/>
|
||||||
</a-tabs>
|
</a-tabs>
|
||||||
<div class="page-body">
|
<div class="page-body">
|
||||||
<keep-alive>
|
<router-view v-slot="{ Component }">
|
||||||
<router-view :key="$route.fullPath"/>
|
<keep-alive>
|
||||||
</keep-alive>
|
<component :is="Component" />
|
||||||
|
</keep-alive>
|
||||||
|
</router-view>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
@@ -81,13 +81,13 @@
|
|||||||
this.upgradeInfo = json.data;
|
this.upgradeInfo = json.data;
|
||||||
if (!!this.upgradeInfo.upgradeContent) {
|
if (!!this.upgradeInfo.upgradeContent) {
|
||||||
this.upgradeInfo.upgradeContent = this.upgradeInfo.upgradeContent.replaceAll(';', '\n');
|
this.upgradeInfo.upgradeContent = this.upgradeInfo.upgradeContent.replaceAll(';', '\n');
|
||||||
|
console.log("zyplayer-doc发现新版本:"
|
||||||
|
+ "\n升级地址:" + json.data.upgradeUrl
|
||||||
|
+ "\n当前版本:" + json.data.nowVersion
|
||||||
|
+ "\n最新版本:" + json.data.lastVersion
|
||||||
|
+ "\n升级内容:" + json.data.upgradeContent
|
||||||
|
);
|
||||||
}
|
}
|
||||||
console.log("zyplayer-doc发现新版本:"
|
|
||||||
+ "\n升级地址:" + json.data.upgradeUrl
|
|
||||||
+ "\n当前版本:" + json.data.nowVersion
|
|
||||||
+ "\n最新版本:" + json.data.lastVersion
|
|
||||||
+ "\n升级内容:" + json.data.upgradeContent
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -1,45 +1,181 @@
|
|||||||
<template>
|
<template>
|
||||||
<a-table :dataSource="dataSource" :columns="columns"></a-table>
|
<a-card>
|
||||||
|
<a-form layout="inline" style="margin-bottom: 20px;">
|
||||||
|
<a-form-item label="文档类型">
|
||||||
|
<a-select placeholder="请选择文档类型" v-model:value="searchParam.docType" style="width: 150px;">
|
||||||
|
<a-select-option value="">全部</a-select-option>
|
||||||
|
<a-select-option :value="1">URL添加</a-select-option>
|
||||||
|
<a-select-option :value="2">JSON内容</a-select-option>
|
||||||
|
</a-select>
|
||||||
|
</a-form-item>
|
||||||
|
<a-form-item label="开放访问">
|
||||||
|
<a-select placeholder="请选择开放访问" v-model:value="searchParam.openVisit" style="width: 150px;">
|
||||||
|
<a-select-option value="">全部</a-select-option>
|
||||||
|
<a-select-option :value="0">否</a-select-option>
|
||||||
|
<a-select-option :value="1">是</a-select-option>
|
||||||
|
</a-select>
|
||||||
|
</a-form-item>
|
||||||
|
<a-form-item label="状态">
|
||||||
|
<a-select placeholder="请选择状态" v-model:value="searchParam.docStatus" style="width: 150px;">
|
||||||
|
<a-select-option value="">全部</a-select-option>
|
||||||
|
<a-select-option :value="1">启用</a-select-option>
|
||||||
|
<a-select-option :value="2">禁用</a-select-option>
|
||||||
|
</a-select>
|
||||||
|
</a-form-item>
|
||||||
|
<a-form-item>
|
||||||
|
<a-button @click="searchDocList" type="primary">查询</a-button>
|
||||||
|
<a-button @click="openNewDoc" :style="{ marginLeft: '8px' }">新建</a-button>
|
||||||
|
</a-form-item>
|
||||||
|
</a-form>
|
||||||
|
<a-table :dataSource="docList" :columns="docListColumns" size="middle"
|
||||||
|
:loading="docListLoading"
|
||||||
|
:scroll="{ x: 1200, y: 'calc(100vh - 340px)' }">
|
||||||
|
<template #bodyCell="{ column, text, row }">
|
||||||
|
<template v-if="column.dataIndex === 'operation'">
|
||||||
|
<a-button type="link">编辑</a-button>
|
||||||
|
<a-button type="link" danger @click="updateDocStatus(row)">删除</a-button>
|
||||||
|
</template>
|
||||||
|
<template v-if="column.dataIndex === 'docType'">
|
||||||
|
<a-tag color="red" v-if="text === 1">URL添加</a-tag>
|
||||||
|
<a-tag color="blue" v-else-if="text === 2">JSON内容</a-tag>
|
||||||
|
</template>
|
||||||
|
<template v-if="column.dataIndex === 'openVisit'">
|
||||||
|
<a-tag color="pink" v-if="text === 0">未开放</a-tag>
|
||||||
|
<a-tag color="green" v-else-if="text === 1">已开放</a-tag>
|
||||||
|
</template>
|
||||||
|
<template v-if="column.dataIndex === 'docStatus'">
|
||||||
|
<a-tag color="green" v-if="text === 1">启用</a-tag>
|
||||||
|
<a-tag color="pink" v-else-if="text === 2">禁用</a-tag>
|
||||||
|
</template>
|
||||||
|
</template>
|
||||||
|
</a-table>
|
||||||
|
</a-card>
|
||||||
|
<a-modal v-model:visible="newDocVisible" title="新增文档" @ok="handleNewDocOk" :width="600">
|
||||||
|
<a-form layout="horizontal" ref="newDocFormRef" :rules="newDocRules" :model="docEdit" :label-col="{span: 6}" :wrapper-col="{span: 18}">
|
||||||
|
<a-form-item label="文档名称" required name="name">
|
||||||
|
<a-input placeholder="请输入文档名称" v-model:value="docEdit.name"></a-input>
|
||||||
|
</a-form-item>
|
||||||
|
<a-form-item label="文档类型" required name="docType">
|
||||||
|
<a-radio-group v-model:value="docEdit.docType">
|
||||||
|
<a-radio :value="1">URL添加</a-radio>
|
||||||
|
<a-radio :value="2">JSON内容</a-radio>
|
||||||
|
</a-radio-group>
|
||||||
|
</a-form-item>
|
||||||
|
<a-form-item label="文档地址" required name="docUrl" v-if="docEdit.docType === 1">
|
||||||
|
<a-input placeholder="请输入文档地址URL" v-model:value="docEdit.docUrl"></a-input>
|
||||||
|
</a-form-item>
|
||||||
|
<a-form-item label="文档内容" required name="jsonContent" v-else-if="docEdit.docType === 2">
|
||||||
|
<a-textarea placeholder="请输入JSON格式的swagger文档内容" v-model:value="docEdit.jsonContent"></a-textarea>
|
||||||
|
</a-form-item>
|
||||||
|
<a-form-item label="开放访问" required name="openVisit">
|
||||||
|
<a-radio-group v-model:value="docEdit.openVisit">
|
||||||
|
<a-radio :value="0">否</a-radio>
|
||||||
|
<a-radio :value="1">开放</a-radio>
|
||||||
|
</a-radio-group>
|
||||||
|
</a-form-item>
|
||||||
|
<a-form-item label="状态" required name="docStatus">
|
||||||
|
<a-radio-group v-model:value="docEdit.docStatus">
|
||||||
|
<a-radio :value="1">启用</a-radio>
|
||||||
|
<a-radio :value="2">禁用</a-radio>
|
||||||
|
</a-radio-group>
|
||||||
|
</a-form-item>
|
||||||
|
</a-form>
|
||||||
|
</a-modal>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import { ref, onMounted } from 'vue'
|
import { toRefs, ref, onMounted } from 'vue';
|
||||||
|
import {zyplayerApi} from '../../api';
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
setup() {
|
setup() {
|
||||||
|
let docList = ref([]);
|
||||||
|
let docListLoading = ref(false);
|
||||||
|
let searchParam = ref({docType: '', openVisit: '', docStatus: ''});
|
||||||
|
const searchDocList = async () => {
|
||||||
|
docListLoading.value = true;
|
||||||
|
zyplayerApi.swaggerDocList(searchParam.value).then(res => {
|
||||||
|
setTimeout(() => docListLoading.value = false, 500);
|
||||||
|
docList.value = res.data || [];
|
||||||
|
});
|
||||||
|
}
|
||||||
|
let docEdit = ref({});
|
||||||
|
let newDocFormRef = ref();
|
||||||
|
let newDocVisible = ref(false);
|
||||||
|
const handleNewDocOk = async () => {
|
||||||
|
newDocFormRef.value.validate().then(() => {
|
||||||
|
zyplayerApi.swaggerDocAdd(docEdit.value).then(res => {
|
||||||
|
searchDocList();
|
||||||
|
newDocVisible.value = false;
|
||||||
|
});
|
||||||
|
}).catch(error => {
|
||||||
|
console.log('error', error);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
const openNewDoc = async () => {
|
||||||
|
newDocVisible.value = true;
|
||||||
|
docEdit.value = {
|
||||||
|
docType: 1, openVisit: 0, docStatus: 1,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
const updateDocStatus = async (row) => {
|
||||||
|
zyplayerApi.swaggerDocUpdate({docStatus: 1}).then(res => {
|
||||||
|
searchDocList();
|
||||||
|
});
|
||||||
|
}
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
console.log('Component is mounted!');
|
searchDocList();
|
||||||
});
|
});
|
||||||
return {
|
return {
|
||||||
dataSource: [
|
searchParam,
|
||||||
|
docList,
|
||||||
|
docListLoading,
|
||||||
|
newDocVisible,
|
||||||
|
docEdit,
|
||||||
|
newDocFormRef,
|
||||||
|
searchDocList,
|
||||||
|
openNewDoc,
|
||||||
|
handleNewDocOk,
|
||||||
|
updateDocStatus,
|
||||||
|
newDocRules: {
|
||||||
|
name: [{required: true, message: '请输入文档名称', trigger: 'change'}],
|
||||||
|
docUrl: [{required: true, message: '请输入文档地址', trigger: 'change'}],
|
||||||
|
jsonContent: [{required: true, message: '请输入JSON格式的swagger文档内容', trigger: 'change'}],
|
||||||
|
docType: [{type: 'number', required: true, message: '请选择文档类型', trigger: 'change'}],
|
||||||
|
openVisit: [{type: 'number', required: true, message: '请选择是否开放访问', trigger: 'change'}],
|
||||||
|
docStatus: [{type: 'number', required: true, message: '请选择文档状态', trigger: 'change'}],
|
||||||
|
},
|
||||||
|
docListColumns: [
|
||||||
{
|
{
|
||||||
key: '1',
|
title: 'ID',
|
||||||
name: '胡彦斌',
|
dataIndex: 'id',
|
||||||
age: 32,
|
width: 70,
|
||||||
address: '西湖区湖底公园1号',
|
}, {
|
||||||
},
|
title: '文档名称',
|
||||||
{
|
|
||||||
key: '2',
|
|
||||||
name: '胡彦祖',
|
|
||||||
age: 42,
|
|
||||||
address: '西湖区湖底公园1号',
|
|
||||||
},
|
|
||||||
],
|
|
||||||
columns: [
|
|
||||||
{
|
|
||||||
title: '姓名',
|
|
||||||
dataIndex: 'name',
|
dataIndex: 'name',
|
||||||
key: 'name',
|
}, {
|
||||||
},
|
title: '文档类型',
|
||||||
{
|
dataIndex: 'docType',
|
||||||
title: '年龄',
|
width: 90,
|
||||||
dataIndex: 'age',
|
}, {
|
||||||
key: 'age',
|
title: '文档地址',
|
||||||
},
|
dataIndex: 'docUrl',
|
||||||
{
|
}, {
|
||||||
title: '住址',
|
title: '目标域名',
|
||||||
dataIndex: 'address',
|
dataIndex: 'rewriteDomain',
|
||||||
key: 'address',
|
}, {
|
||||||
|
title: '开放访问',
|
||||||
|
dataIndex: 'openVisit',
|
||||||
|
width: 90,
|
||||||
|
}, {
|
||||||
|
title: '状态',
|
||||||
|
dataIndex: 'docStatus',
|
||||||
|
width: 90,
|
||||||
|
}, {
|
||||||
|
title: '操作',
|
||||||
|
dataIndex: 'operation',
|
||||||
|
fixed: 'right',
|
||||||
|
width: 170,
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user