Commit 04c3cdf372fa5a473d777fc453b53e8400685843

Authored by YunaiV
1 parent 70a10b26

增加 swagger、druid、skywalking、admin 的自定义路径

yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/config/ConfigController.java
@@ -73,7 +73,7 @@ public class ConfigController { @@ -73,7 +73,7 @@ public class ConfigController {
73 public CommonResult<String> getConfigKey(@RequestParam("key") String key) { 73 public CommonResult<String> getConfigKey(@RequestParam("key") String key) {
74 ConfigDO config = configService.getConfigByKey(key); 74 ConfigDO config = configService.getConfigByKey(key);
75 if (config == null) { 75 if (config == null) {
76 - return null; 76 + return success(null);
77 } 77 }
78 if (!config.getVisible()) { 78 if (!config.getVisible()) {
79 throw exception(ErrorCodeConstants.CONFIG_GET_VALUE_ERROR_IF_VISIBLE); 79 throw exception(ErrorCodeConstants.CONFIG_GET_VALUE_ERROR_IF_VISIBLE);
yudao-ui-admin/src/api/infra/redis.js
@@ -7,48 +7,3 @@ export function getCache() { @@ -7,48 +7,3 @@ export function getCache() {
7 method: 'get' 7 method: 'get'
8 }) 8 })
9 } 9 }
10 -  
11 -// 获取模块  
12 -export function getKeyDefineList() {  
13 - return request({  
14 - url: '/infra/redis/get-key-define-list',  
15 - method: 'get'  
16 - })  
17 -}  
18 -  
19 -// 获取键名列表  
20 -export function getKeyList(keyTemplate) {  
21 - return request({  
22 - url: '/infra/redis/get-key-list',  
23 - method: 'get',  
24 - params: {  
25 - keyTemplate  
26 - }  
27 - })  
28 -}  
29 -  
30 -// 获取缓存内容  
31 -export function getKeyValue(key) {  
32 - return request({  
33 - url: '/infra/redis/get-key-value?key=' + key,  
34 - method: 'get'  
35 - })  
36 -}  
37 -  
38 -// 根据键名删除缓存  
39 -export function deleteKey(key) {  
40 - return request({  
41 - url: '/infra/redis/delete-key?key=' + key,  
42 - method: 'delete'  
43 - })  
44 -}  
45 -  
46 -export function deleteKeys(keyTemplate) {  
47 - return request({  
48 - url: '/infra/redis/delete-keys?',  
49 - method: 'delete',  
50 - params: {  
51 - keyTemplate  
52 - }  
53 - })  
54 -}  
yudao-ui-admin/src/views/infra/druid/index.vue
@@ -2,18 +2,31 @@ @@ -2,18 +2,31 @@
2 <div> 2 <div>
3 <doc-alert title="数据库 MyBatis" url="https://doc.iocoder.cn/mybatis/" /> 3 <doc-alert title="数据库 MyBatis" url="https://doc.iocoder.cn/mybatis/" />
4 <doc-alert title="多数据源(读写分离)" url="https://doc.iocoder.cn/dynamic-datasource/" /> 4 <doc-alert title="多数据源(读写分离)" url="https://doc.iocoder.cn/dynamic-datasource/" />
5 - <i-frame :src="url" /> 5 +
  6 + <i-frame v-if="!loading" :src="url" />
6 </div> 7 </div>
7 </template> 8 </template>
8 <script> 9 <script>
9 import iFrame from "@/components/iFrame/index"; 10 import iFrame from "@/components/iFrame/index";
  11 +import { getConfigKey } from "@/api/infra/config";
10 export default { 12 export default {
11 name: "Druid", 13 name: "Druid",
12 components: { iFrame }, 14 components: { iFrame },
13 data() { 15 data() {
14 return { 16 return {
15 - url: process.env.VUE_APP_BASE_API + "/druid/index.html" 17 + url: process.env.VUE_APP_BASE_API + "/druid/index.html",
  18 + loading: true
16 }; 19 };
17 }, 20 },
  21 + created() {
  22 + getConfigKey("url.druid").then(response => {
  23 + if (!response.data || response.data.length === 0) {
  24 + return
  25 + }
  26 + this.url = response.data;
  27 + }).finally(() => {
  28 + this.loading = false;
  29 + })
  30 + }
18 }; 31 };
19 </script> 32 </script>
yudao-ui-admin/src/views/infra/redis/index.vue
@@ -65,77 +65,11 @@ @@ -65,77 +65,11 @@
65 </el-card> 65 </el-card>
66 </el-col> 66 </el-col>
67 </el-row> 67 </el-row>
68 -  
69 - <el-table v-loading="keyDefineListLoad" :data="keyDefineList" row-key="id" @row-click="openKeyTemplate">  
70 - <el-table-column prop="keyTemplate" label="Key 模板" width="200" />  
71 - <el-table-column prop="keyType" label="Key 类型" width="100" />  
72 - <el-table-column prop="valueType" label="Value 类型" />  
73 - <el-table-column prop="timeoutType" label="超时时间" width="200">  
74 - <template v-slot="scope">  
75 - <dict-tag  
76 - :type="DICT_TYPE.INFRA_REDIS_TIMEOUT_TYPE"  
77 - :value="scope.row.timeoutType"  
78 - />  
79 - <span v-if="scope.row.timeout > 0"  
80 - >({{ scope.row.timeout / 1000 }} 秒)</span  
81 - >  
82 - </template>  
83 - </el-table-column>  
84 - <el-table-column prop="memo" label="备注" />  
85 - </el-table>  
86 -  
87 - <!-- 缓存模块信息框 -->  
88 - <el-dialog :title="keyTemplate + ' 模板'" :visible.sync="open" width="70vw" append-to-body>  
89 - <el-row :gutter="10">  
90 - <el-col :span="14" class="card-box">  
91 - <el-card style="height: 70vh; overflow: scroll">  
92 - <div slot="header">  
93 - <span>键名列表</span>  
94 - <el-button style="float: right; padding: 3px 0" type="text" icon="el-icon-refresh-right" @click="refreshKeys" />  
95 - </div>  
96 - <el-table :data="cacheKeys" style="width: 100%" @row-click="handleKeyValue">  
97 - <el-table-column label="缓存键名" align="center" :show-overflow-tooltip="true">  
98 - <template v-slot="scope">{{ scope.row }}</template>  
99 - </el-table-column>  
100 - <el-table-column label="操作" width="60" align="center" class-name="small-padding fixed-width">  
101 - <template v-slot="scope">  
102 - <el-button size="mini" type="text" icon="el-icon-delete" @click="handleDeleteKey(scope.row)" />  
103 - </template>  
104 - </el-table-column>  
105 - </el-table>  
106 - </el-card>  
107 - </el-col>  
108 -  
109 - <el-col :span="10">  
110 - <el-card :bordered="false" style="height: 70vh">  
111 - <div slot="header">  
112 - <span>缓存内容</span>  
113 - <el-button style="float: right; padding: 3px 0" type="text" icon="el-icon-refresh-right"  
114 - @click="handleDeleteKeys(keyTemplate)">清理全部</el-button>  
115 - </div>  
116 - <el-form :model="cacheForm">  
117 - <el-row :gutter="32">  
118 - <el-col :offset="1" :span="22">  
119 - <el-form-item label="缓存键名:" prop="key">  
120 - <el-input v-model="cacheForm.key" :readOnly="true" />  
121 - </el-form-item>  
122 - </el-col>  
123 - <el-col :offset="1" :span="22">  
124 - <el-form-item label="缓存内容:" prop="value">  
125 - <el-input v-model="cacheForm.value" type="textarea" :rows="12" :readOnly="true"/>  
126 - </el-form-item>  
127 - </el-col>  
128 - </el-row>  
129 - </el-form>  
130 - </el-card>  
131 - </el-col>  
132 - </el-row>  
133 - </el-dialog>  
134 </div> 68 </div>
135 </template> 69 </template>
136 70
137 <script> 71 <script>
138 -import {getCache, getKeyDefineList, getKeyList, getKeyValue, deleteKey, deleteKeys} from "@/api/infra/redis"; 72 +import { getCache } from "@/api/infra/redis";
139 import * as echarts from 'echarts' 73 import * as echarts from 'echarts'
140 require('echarts/theme/macarons') // echarts theme 74 require('echarts/theme/macarons') // echarts theme
141 export default { 75 export default {
@@ -147,15 +81,7 @@ export default { @@ -147,15 +81,7 @@ export default {
147 // 使用内存 81 // 使用内存
148 usedmemory: null, 82 usedmemory: null,
149 // cache 信息 83 // cache 信息
150 - cache: [],  
151 - // key 列表  
152 - keyDefineListLoad: true,  
153 - keyDefineList: [],  
154 - // 模块弹出框  
155 - open: false,  
156 - keyTemplate: "",  
157 - cacheKeys: [],  
158 - cacheForm: {} 84 + cache: []
159 }; 85 };
160 }, 86 },
161 created () { 87 created () {
@@ -220,61 +146,12 @@ export default { @@ -220,61 +146,12 @@ export default {
220 ], 146 ],
221 }); 147 });
222 }); 148 });
223 -  
224 - // 查询 Redis Key 列表  
225 - getKeyDefineList().then(response => {  
226 - this.keyDefineList = response.data;  
227 - this.keyDefineListLoad = false;  
228 - });  
229 }, 149 },
230 150
231 // 打开加载层 151 // 打开加载层
232 openLoading () { 152 openLoading () {
233 this.$modal.loading("正在加载缓存监控数据,请稍后!"); 153 this.$modal.loading("正在加载缓存监控数据,请稍后!");
234 - },  
235 -  
236 - // 打开缓存弹窗  
237 - openKeyTemplate (keyDefine) {  
238 - this.open = true;  
239 - // 加载键名列表  
240 - this.keyTemplate = keyDefine.keyTemplate;  
241 - this.doGetKeyList(this.keyTemplate);  
242 - },  
243 -  
244 - // 获取键名列表  
245 - doGetKeyList (keyTemplate) {  
246 - getKeyList(keyTemplate).then(response => {  
247 - this.cacheKeys = response.data  
248 - this.cacheForm = {}  
249 - })  
250 - },  
251 -  
252 - // 获取缓存值  
253 - handleKeyValue (key) {  
254 - getKeyValue(key).then(response => {  
255 - this.cacheForm = response.data  
256 - })  
257 - },  
258 -  
259 - // 刷新键名列表  
260 - refreshKeys() {  
261 - this.$modal.msgSuccess("刷新键名列表成功");  
262 - this.doGetKeyList(this.keyTemplate);  
263 - },  
264 -  
265 - // 删除缓存  
266 - handleDeleteKey(key){  
267 - deleteKey(key).then(response => {  
268 - this.$modal.msgSuccess("清理缓存键名[" + key + "]成功");  
269 - this.doGetKeyList(this.keyTemplate);  
270 - })  
271 - },  
272 - handleDeleteKeys(keyTemplate){  
273 - deleteKeys(keyTemplate).then(response => {  
274 - this.$modal.msgSuccess("清空[" + keyTemplate + "]成功");  
275 - this.doGetKeyList(this.keyTemplate);  
276 - })  
277 - }, 154 + }
278 }, 155 },
279 }; 156 };
280 </script> 157 </script>
yudao-ui-admin/src/views/infra/server/index.vue
1 <template> 1 <template>
2 <div> 2 <div>
3 <doc-alert title="服务监控" url="https://doc.iocoder.cn/server-monitor/" /> 3 <doc-alert title="服务监控" url="https://doc.iocoder.cn/server-monitor/" />
4 - <i-frame :src="url" /> 4 + <i-frame v-if="!loading" :src="url" />
5 </div> 5 </div>
6 </template> 6 </template>
7 <script> 7 <script>
8 import iFrame from "@/components/iFrame/index"; 8 import iFrame from "@/components/iFrame/index";
  9 +import { getConfigKey } from "@/api/infra/config";
9 export default { 10 export default {
10 name: "Druid", 11 name: "Druid",
11 components: { iFrame }, 12 components: { iFrame },
12 data() { 13 data() {
13 return { 14 return {
14 - url: process.env.VUE_APP_BASE_API + "/admin/applications" 15 + url: process.env.VUE_APP_BASE_API + "/admin/applications",
  16 + loading: true
15 }; 17 };
16 }, 18 },
  19 + created() {
  20 + getConfigKey("url.spring-boot-admin").then(response => {
  21 + if (!response.data || response.data.length === 0) {
  22 + return
  23 + }
  24 + this.url = response.data;
  25 + }).finally(() => {
  26 + this.loading = false;
  27 + })
  28 + }
17 }; 29 };
18 </script> 30 </script>
yudao-ui-admin/src/views/infra/skywalking/index.vue
1 <template> 1 <template>
2 <div> 2 <div>
3 <doc-alert title="服务监控" url="https://doc.iocoder.cn/server-monitor/" /> 3 <doc-alert title="服务监控" url="https://doc.iocoder.cn/server-monitor/" />
4 - <i-frame :src="url" /> 4 + <i-frame v-if="!loading" :src="url" />
5 </div> 5 </div>
6 </template> 6 </template>
7 <script> 7 <script>
8 import iFrame from "@/components/iFrame/index"; 8 import iFrame from "@/components/iFrame/index";
  9 +import { getConfigKey } from "@/api/infra/config";
9 export default { 10 export default {
10 name: "Druid", 11 name: "Druid",
11 components: { iFrame }, 12 components: { iFrame },
12 data() { 13 data() {
13 return { 14 return {
14 - url: "http://skywalking.shop.iocoder.cn", // TODO 芋艿,后续改成配置读取 15 + url: "http://skywalking.shop.iocoder.cn",
  16 + loading: true
15 }; 17 };
16 }, 18 },
  19 + created() {
  20 + getConfigKey("url.skywalking").then(response => {
  21 + if (!response.data || response.data.length === 0) {
  22 + return
  23 + }
  24 + this.url = response.data;
  25 + }).finally(() => {
  26 + this.loading = false;
  27 + })
  28 + }
17 }; 29 };
18 </script> 30 </script>
yudao-ui-admin/src/views/infra/swagger/index.vue
1 <template> 1 <template>
2 <div> 2 <div>
3 <doc-alert title="接口文档" url="https://doc.iocoder.cn/api-doc/" /> 3 <doc-alert title="接口文档" url="https://doc.iocoder.cn/api-doc/" />
4 - <i-frame :src="url" /> 4 + <i-frame v-if="!loading" :src="url" />
5 </div> 5 </div>
6 </template> 6 </template>
7 <script> 7 <script>
8 import iFrame from "@/components/iFrame/index"; 8 import iFrame from "@/components/iFrame/index";
  9 +import { getConfigKey } from "@/api/infra/config";
9 export default { 10 export default {
10 name: "Druid", 11 name: "Druid",
11 components: { iFrame }, 12 components: { iFrame },
12 data() { 13 data() {
13 return { 14 return {
14 - // url: process.env.VUE_APP_BASE_API + "/doc.html"  
15 - url: process.env.VUE_APP_BASE_API + "/swagger-ui" 15 + url: process.env.VUE_APP_BASE_API + "/doc.html", // Knife4j UI
  16 + // url: process.env.VUE_APP_BASE_API + "/swagger-ui", // Swagger UI
  17 + loading: true
16 }; 18 };
17 }, 19 },
  20 + created() {
  21 + getConfigKey("url.swagger").then(response => {
  22 + if (!response.data || response.data.length === 0) {
  23 + return
  24 + }
  25 + this.url = response.data;
  26 + }).finally(() => {
  27 + this.loading = false;
  28 + })
  29 + }
18 }; 30 };
19 </script> 31 </script>