Commit 7fb8eceed7f0a7262a22a467ce2d57bcb90aa016

Authored by zhangdaiscott
1 parent 9b8273e1

【issues/I52J6R】gateway,在网关路由页面如何设置路由条件Header

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