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 * @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);
} }

View File

@@ -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);
} }
} }

View File

@@ -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);
} }

View File

@@ -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());

View File

@@ -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}),
}; };

View File

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

View File

@@ -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('获取文档列表请求失败');
} }
}); });
} }

View File

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

View File

@@ -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
);
} }
}); });
}, },

View File

@@ -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,
}, },
], ],
}; };