swagger文档增删改开发

This commit is contained in:
暮光:城中城
2021-10-23 23:13:56 +08:00
parent 7e57dbaade
commit 2632fbe1e4
10 changed files with 212 additions and 55 deletions

View File

@@ -14,5 +14,5 @@ import java.util.List;
* @since 2021-10-15
*/
public interface SwaggerDocService extends IService<SwaggerDoc> {
public List<SwaggerDoc> getSwaggerDocList();
public List<SwaggerDoc> getSwaggerDocList(SwaggerDoc swaggerDoc);
}

View File

@@ -21,9 +21,12 @@ import java.util.List;
public class SwaggerDocServiceImpl extends ServiceImpl<SwaggerDocMapper, SwaggerDoc> implements SwaggerDocService {
@Override
public List<SwaggerDoc> getSwaggerDocList() {
public List<SwaggerDoc> getSwaggerDocList(SwaggerDoc swaggerDoc) {
QueryWrapper<SwaggerDoc> queryWrapper = new QueryWrapper<>();
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);
}
}

View File

@@ -50,8 +50,8 @@ public class SwaggerDocumentController {
*/
@ResponseBody
@PostMapping(value = "/list")
public ResponseJson<List<SwaggerDoc>> list() {
List<SwaggerDoc> docList = swaggerDocService.getSwaggerDocList();
public ResponseJson<List<SwaggerDoc>> list(SwaggerDoc swaggerDoc) {
List<SwaggerDoc> docList = swaggerDocService.getSwaggerDocList(swaggerDoc);
return DocResponseJson.ok(docList);
}

View File

@@ -35,7 +35,7 @@ public class SwaggerProxyController {
@RequestMapping("/swagger-resources")
public List<SwaggerResource> swaggerResources() {
Set<SwaggerResource> resourceList = new HashSet<>();
List<SwaggerDoc> docList = swaggerDocService.getSwaggerDocList();
List<SwaggerDoc> docList = swaggerDocService.getSwaggerDocList(new SwaggerDoc());
for (SwaggerDoc swaggerDoc : docList) {
SwaggerResource resource = new SwaggerResource();
resource.setUrl("/doc-swagger/doc/content?id=" + swaggerDoc.getId());

View File

@@ -4,5 +4,8 @@ export const zyplayerApi = {
getSelfUserInfo: data => apiClient({url: '/user/info/selfInfo', method: 'post', data: data}),
userLogout: data => apiClient({url: '/logout', 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}),
};

View File

@@ -5,7 +5,7 @@
<img src="../../assets/logo.png">
<h1>swagger文档管理</h1>
</div>
<menu-layout></menu-layout>
<menu-layout :collapsed="appMenuCollapsed"></menu-layout>
</a-layout-sider>
<div ref="rightResize" class="right-resize" v-show="!appMenuCollapsed">
<i ref="rightResizeBar">...</i>

View File

@@ -1,14 +1,17 @@
<template>
<div class="menu-layout">
<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-menu theme="light" mode="inline" :inline-collapsed="collapsed" v-model:openKeys="openKeys" v-model:selectedKeys="selectedKeys">
<a-menu theme="light" mode="inline" :inline-collapsed="false" v-model:openKeys="openKeys" v-model:selectedKeys="selectedKeys">
<menu-children-layout :menuItem="menuItem" v-for="menuItem in menuData"></menu-children-layout>
</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>
</template>
@@ -18,12 +21,17 @@
export default {
name: 'MenuLayout',
props: {
collapsed: {
type: Boolean,
default: false
},
},
data() {
return {
menuData: [],
selectedKeys: [],
openKeys: [],
collapsed: false,
// 文档树
treeData: [
{
@@ -49,6 +57,9 @@
},
watch:{
'$store.state.userInfo'(userInfo) {
},
collapsed(x) {
console.log(x, this.collapsed)
}
},
components: {MenuChildrenLayout},
@@ -80,6 +91,8 @@
if (this.swaggerResourceList.length > 0) {
this.swaggerDocChoice = this.swaggerResourceList[0].url;
}
} else {
this.$message.error('获取文档列表请求失败');
}
});
}

View File

@@ -1,12 +1,14 @@
<template>
<div class="page-layout">
<a-tabs type="card" v-model:activeKey="activePage" closable @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-tabs type="editable-card" hide-add v-model:activeKey="activePage" @tab-click="changePage" @edit="removePageTab" style="padding: 5px 10px 0;">
<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>
<div class="page-body">
<keep-alive>
<router-view :key="$route.fullPath"/>
</keep-alive>
<router-view v-slot="{ Component }">
<keep-alive>
<component :is="Component" />
</keep-alive>
</router-view>
</div>
</div>
</template>

View File

@@ -81,13 +81,13 @@
this.upgradeInfo = json.data;
if (!!this.upgradeInfo.upgradeContent) {
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
);
}
});
},

View File

@@ -1,45 +1,181 @@
<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>
<script>
import { ref, onMounted } from 'vue'
import { toRefs, ref, onMounted } from 'vue';
import {zyplayerApi} from '../../api';
export default {
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(() => {
console.log('Component is mounted!');
searchDocList();
});
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',
name: '胡彦斌',
age: 32,
address: '西湖区湖底公园1号',
},
{
key: '2',
name: '胡彦祖',
age: 42,
address: '西湖区湖底公园1号',
},
],
columns: [
{
title: '姓名',
title: 'ID',
dataIndex: 'id',
width: 70,
}, {
title: '文档名称',
dataIndex: 'name',
key: 'name',
},
{
title: '年龄',
dataIndex: 'age',
key: 'age',
},
{
title: '住址',
dataIndex: 'address',
key: 'address',
}, {
title: '文档类型',
dataIndex: 'docType',
width: 90,
}, {
title: '文档地址',
dataIndex: 'docUrl',
}, {
title: '目标域名',
dataIndex: 'rewriteDomain',
}, {
title: '开放访问',
dataIndex: 'openVisit',
width: 90,
}, {
title: '状态',
dataIndex: 'docStatus',
width: 90,
}, {
title: '操作',
dataIndex: 'operation',
fixed: 'right',
width: 170,
},
],
};