Commit 7fb8eceed7f0a7262a22a467ce2d57bcb90aa016
1 parent
9b8273e1
【issues/I52J6R】gateway,在网关路由页面如何设置路由条件Header
Showing
3 changed files
with
137 additions
and
21 deletions
ant-design-vue-jeecg/src/views/system/modules/GateWayRouteModal.vue
... | ... | @@ -28,14 +28,15 @@ |
28 | 28 | <a-divider>{{item.name}} |
29 | 29 | <a-icon type="delete" size="22" @click="removePredicate(router,index)"/> |
30 | 30 | </a-divider> |
31 | - <div> | |
32 | - <template v-for="(tag, index) in item.args"> | |
33 | - <a-input v-if="index==currentTagIndex" ref="input" type="text" size="small" | |
31 | + <!--当name在 genKeyRouter 时不需要指定key,后台自动拼key --> | |
32 | + <div v-if="genKeyRouter.includes(item.name)"> | |
33 | + <template v-for="(tag, tagIndex) in item.args"> | |
34 | + <a-input v-if="tagIndex==currentTagIndex&&index==currentNameIndex" ref="input" type="text" size="small" | |
34 | 35 | :style="{ width: '190px' }" |
35 | 36 | :value="tag" |
36 | - @change="handleInputChange" @blur="handleInputEditConfirm(item,tag,index)" | |
37 | - @keyup.enter="handleInputEditConfirm(item,tag,index)"/> | |
38 | - <a-tag v-else :key="tag" :closable="true" @close="() => removeTag(item,tag)" @click="editTag(tag,index)"> | |
37 | + @change="handleInputChange" @blur="handleInputEditConfirm(item,tag,tagIndex)" | |
38 | + @keyup.enter="handleInputEditConfirm(item,tag,tagIndex)"/> | |
39 | + <a-tag v-else :key="tag" :closable="true" @close="() => removeTag(item,tag)" @click="editTag(tag,tagIndex,index)"> | |
39 | 40 | {{ tag }} |
40 | 41 | </a-tag> |
41 | 42 | </template> |
... | ... | @@ -49,11 +50,27 @@ |
49 | 50 | 新建{{item.name}} |
50 | 51 | </a-tag> |
51 | 52 | </div> |
53 | + <!--当name不在 genKeyRouter 时需要指定key--> | |
54 | + <div v-if="!genKeyRouter.includes(item.name)"> | |
55 | + <template v-for="(value, key) in item.args"> | |
56 | + <a-row> | |
57 | + <a-col :span="5" style="margin-top:2px"> | |
58 | + <span v-if="key=='header'" >Header名称</span> | |
59 | + <span v-if="key=='regexp'">参数值</span> | |
60 | + <span v-if="key=='param'">参数名</span> | |
61 | + <span v-if="key=='name'">Cookie名称</span> | |
62 | + </a-col> | |
63 | + <a-col :span="18"> | |
64 | + <a-input :defaultValue="value" placeholder="参数值" style="width: 70%; margin-right: 8px;margin-top: 3px" @change="(e)=>valueChange(e,item.args,key)"/> | |
65 | + </a-col> | |
66 | + </a-row> | |
67 | + </template> | |
68 | + </div> | |
52 | 69 | </div> |
53 | 70 | <p class="btn" style="padding-top: 10px"> |
54 | 71 | <a-dropdown> |
55 | - <a-menu slot="overlay" @click="predicatesHandleMenuClick"> | |
56 | - <a-menu-item :key="item" v-for="item in tagArray">{{item}}</a-menu-item> | |
72 | + <a-menu slot="overlay"> | |
73 | + <a-menu-item :key="item.name" v-for="item in tagArray" @click="predicatesHandleMenuClick(item)">{{item.name}}</a-menu-item> | |
57 | 74 | </a-menu> |
58 | 75 | <a-button type="dashed" style="margin-left: 8px;width:100%"> 添加路由条件 |
59 | 76 | <a-icon type="down"/> |
... | ... | @@ -113,8 +130,55 @@ |
113 | 130 | currentNameIndex: 0, |
114 | 131 | currentTagIndex:-1, |
115 | 132 | predicates: {}, |
116 | - filterArray: [{ key: 0, name: '熔断器' }, { key: 1, name: '限流过滤器' }], | |
117 | - tagArray: ['Path', 'Host', 'Cookie', 'Header', 'Method', 'Query', 'After', 'Before', 'Between', 'RemoteAddr'], | |
133 | + filterArray: [ { key: 1, name: '限流过滤器' }], | |
134 | + //gateway对应的规则key | |
135 | + tagArray: [ | |
136 | + { | |
137 | + name:'Header', | |
138 | + args:{ | |
139 | + header:'', | |
140 | + regexp:'' | |
141 | + } | |
142 | + }, | |
143 | + { | |
144 | + name:'Query', | |
145 | + args:{ | |
146 | + param:'', | |
147 | + regexp:'' | |
148 | + } | |
149 | + }, | |
150 | + { | |
151 | + name:'Method', | |
152 | + args:[] | |
153 | + }, | |
154 | + { | |
155 | + name:'Host', | |
156 | + args:[] | |
157 | + }, | |
158 | + { | |
159 | + name:'Cookie', | |
160 | + args:{ | |
161 | + name:'', | |
162 | + regexp:'' | |
163 | + } | |
164 | + }, | |
165 | + { | |
166 | + name:'After', | |
167 | + args:[] | |
168 | + }, | |
169 | + { | |
170 | + name:'Before', | |
171 | + args:[] | |
172 | + }, | |
173 | + { | |
174 | + name:'Between', | |
175 | + args:[] | |
176 | + }, | |
177 | + { | |
178 | + name:'RemoteAddr', | |
179 | + args:[] | |
180 | + } | |
181 | + ], | |
118 | 182 | inputVisible: false, |
119 | 183 | inputValue: '', |
120 | 184 | url: { |
... | ... | @@ -124,7 +188,8 @@ |
124 | 188 | router: this.getRouter(), |
125 | 189 | title: '路由编辑', |
126 | 190 | visible: false, |
127 | - loading: false | |
191 | + loading: false, | |
192 | + genKeyRouter:["Path","Host","Method","After","Before","Between","RemoteAddr"] | |
128 | 193 | } |
129 | 194 | }, |
130 | 195 | methods: { |
... | ... | @@ -163,12 +228,22 @@ |
163 | 228 | //添加路由选项 |
164 | 229 | predicatesHandleMenuClick(e) { |
165 | 230 | this.router.predicates.push({ |
166 | - args: [], | |
167 | - name: e.key | |
231 | + args: e.args, | |
232 | + name: e.name, | |
168 | 233 | }) |
169 | 234 | }, |
170 | - editTag(tag,index){ | |
171 | - this.currentTagIndex=index | |
235 | + editTag(tag, tagIndex,index){ | |
236 | + this.currentNameIndex = index; | |
237 | + this.currentTagIndex=tagIndex | |
238 | + }, | |
239 | + /** | |
240 | + * 值修改事件 | |
241 | + * @param e | |
242 | + * @param item | |
243 | + * @param key | |
244 | + */ | |
245 | + valueChange(e,item,key){ | |
246 | + item[key]=e.target.value | |
172 | 247 | }, |
173 | 248 | //显示输入框 |
174 | 249 | showInput(item, index) { |
... | ... | @@ -226,7 +301,7 @@ |
226 | 301 | value: 20 |
227 | 302 | }], |
228 | 303 | name:"RequestRateLimiter", |
229 | - title: this.filterArray[1].name | |
304 | + title: this.filterArray[0].name | |
230 | 305 | }) |
231 | 306 | } |
232 | 307 | }, |
... | ... |
jeecg-boot/jeecg-cloud-module/jeecg-cloud-gateway/src/main/java/org/jeecg/loader/DynamicRouteLoader.java
1 | 1 | package org.jeecg.loader; |
2 | 2 | |
3 | +import cn.hutool.core.util.ArrayUtil; | |
3 | 4 | import cn.hutool.core.util.ObjectUtil; |
4 | 5 | import com.alibaba.fastjson.JSON; |
5 | 6 | import com.alibaba.fastjson.JSONArray; |
... | ... | @@ -35,6 +36,7 @@ import java.net.URI; |
35 | 36 | import java.net.URISyntaxException; |
36 | 37 | import java.util.ArrayList; |
37 | 38 | import java.util.List; |
39 | +import java.util.Map; | |
38 | 40 | import java.util.Properties; |
39 | 41 | import java.util.concurrent.Executor; |
40 | 42 | |
... | ... | @@ -55,7 +57,10 @@ public class DynamicRouteLoader implements ApplicationEventPublisherAware { |
55 | 57 | private DynamicRouteService dynamicRouteService; |
56 | 58 | private ConfigService configService; |
57 | 59 | private RedisUtil redisUtil; |
58 | - | |
60 | + /** | |
61 | + * 需要拼接key的路由条件 | |
62 | + */ | |
63 | + private static String[] GEN_KEY_ROUTERS = new String[]{"Path", "Host", "Method", "After", "Before", "Between", "RemoteAddr"}; | |
59 | 64 | |
60 | 65 | public DynamicRouteLoader(MyInMemoryRouteDefinitionRepository repository, DynamicRouteService dynamicRouteService, RedisUtil redisUtil) { |
61 | 66 | |
... | ... | @@ -195,11 +200,27 @@ public class DynamicRouteLoader implements ApplicationEventPublisherAware { |
195 | 200 | for (Object map : list) { |
196 | 201 | JSONObject json = (JSONObject) map; |
197 | 202 | PredicateDefinition predicateDefinition = new PredicateDefinition(); |
198 | - predicateDefinition.setName(json.getString("name")); | |
199 | - JSONArray jsonArray = json.getJSONArray("args"); | |
200 | - for (int j = 0; j < jsonArray.size(); j++) { | |
201 | - predicateDefinition.addArg("_genkey" + j, jsonArray.get(j).toString()); | |
203 | + //update-begin-author:zyf date:20220419 for:【VUEN-762】路由条件添加异常问题,原因是部分路由条件参数需要设置固定key | |
204 | + String name=json.getString("name"); | |
205 | + predicateDefinition.setName(name); | |
206 | + //路由条件是否拼接Key | |
207 | + if(ArrayUtil.contains(GEN_KEY_ROUTERS,name)) { | |
208 | + JSONArray jsonArray = json.getJSONArray("args"); | |
209 | + for (int j = 0; j < jsonArray.size(); j++) { | |
210 | + predicateDefinition.addArg("_genkey" + j, jsonArray.get(j).toString()); | |
211 | + } | |
212 | + }else{ | |
213 | + JSONObject jsonObject = json.getJSONObject("args"); | |
214 | + if(ObjectUtil.isNotEmpty(jsonObject)){ | |
215 | + for (Map.Entry<String, Object> entry : jsonObject.entrySet()) { | |
216 | + Object valueObj=entry.getValue(); | |
217 | + if(ObjectUtil.isNotEmpty(valueObj)) { | |
218 | + predicateDefinition.addArg(entry.getKey(), valueObj.toString()); | |
219 | + } | |
220 | + } | |
221 | + } | |
202 | 222 | } |
223 | + //update-end-author:zyf date:20220419 for:【VUEN-762】路由条件添加异常问题,原因是部分路由条件参数需要设置固定key | |
203 | 224 | predicateDefinitionList.add(predicateDefinition); |
204 | 225 | } |
205 | 226 | route.setPredicates(predicateDefinitionList); |
... | ... |
jeecg-boot/jeecg-cloud-module/jeecg-cloud-nacos/src/main/java/com/alibaba/nacos/control/IndexController.java
0 → 100644
1 | +package com.alibaba.nacos.control; | |
2 | + | |
3 | +import org.slf4j.Logger; | |
4 | +import org.slf4j.LoggerFactory; | |
5 | +import org.springframework.stereotype.Controller; | |
6 | +import org.springframework.ui.Model; | |
7 | +import org.springframework.web.bind.annotation.GetMapping; | |
8 | + | |
9 | +/** | |
10 | + * 积木报表-设置默认首页跳转 | |
11 | + */ | |
12 | +@Controller | |
13 | +public class IndexController { | |
14 | + private Logger logger = LoggerFactory.getLogger(IndexController.class); | |
15 | + | |
16 | + @GetMapping("/") | |
17 | + public String index(Model model) { | |
18 | + return "/nacos"; // 视图重定向 - 跳转 | |
19 | + } | |
20 | +} | |
0 | 21 | \ No newline at end of file |
... | ... |