Commit 2fb96c6d by Nepxion

增加图形化灰度发布功能

parent b7778e5f
...@@ -392,7 +392,7 @@ public class ServiceTopology extends AbstractTopology { ...@@ -392,7 +392,7 @@ public class ServiceTopology extends AbstractTopology {
} }
resultTextArea.setText(result.toString()); resultTextArea.setText(result.toString());
JBasicOptionPane.showOptionDialog(HandleManager.getFrame(ServiceTopology.this), new JBasicScrollPane(resultTextArea), "执行结果", JBasicOptionPane.DEFAULT_OPTION, JBasicOptionPane.PLAIN_MESSAGE, ConsoleIconFactory.getSwingIcon("banner/edit.png"), new Object[] { SwingLocale.getString("close") }, null, true); JBasicOptionPane.showOptionDialog(HandleManager.getFrame(ServiceTopology.this), new JBasicScrollPane(resultTextArea), ConsoleLocale.getString("execute_result"), JBasicOptionPane.DEFAULT_OPTION, JBasicOptionPane.PLAIN_MESSAGE, ConsoleIconFactory.getSwingIcon("banner/edit.png"), new Object[] { SwingLocale.getString("close") }, null, true);
} }
@Override @Override
...@@ -436,7 +436,7 @@ public class ServiceTopology extends AbstractTopology { ...@@ -436,7 +436,7 @@ public class ServiceTopology extends AbstractTopology {
if (group != null) { if (group != null) {
if (StringUtils.isEmpty(group.getClientProperty("plugin").toString())) { if (StringUtils.isEmpty(group.getClientProperty("plugin").toString())) {
JBasicOptionPane.showMessageDialog(HandleManager.getFrame(ServiceTopology.this), "该服务集群不能执行灰度发布", SwingLocale.getString("warning"), JBasicOptionPane.WARNING_MESSAGE); JBasicOptionPane.showMessageDialog(HandleManager.getFrame(ServiceTopology.this), ConsoleLocale.getString("group_not_for_gray_release"), SwingLocale.getString("warning"), JBasicOptionPane.WARNING_MESSAGE);
return; return;
} }
...@@ -444,7 +444,7 @@ public class ServiceTopology extends AbstractTopology { ...@@ -444,7 +444,7 @@ public class ServiceTopology extends AbstractTopology {
if (node != null) { if (node != null) {
if (StringUtils.isEmpty(node.getClientProperty("plugin").toString())) { if (StringUtils.isEmpty(node.getClientProperty("plugin").toString())) {
JBasicOptionPane.showMessageDialog(HandleManager.getFrame(ServiceTopology.this), "该服务不能执行灰度发布", SwingLocale.getString("warning"), JBasicOptionPane.WARNING_MESSAGE); JBasicOptionPane.showMessageDialog(HandleManager.getFrame(ServiceTopology.this), ConsoleLocale.getString("node_not_for_gray_release"), SwingLocale.getString("warning"), JBasicOptionPane.WARNING_MESSAGE);
return; return;
} }
...@@ -501,7 +501,7 @@ public class ServiceTopology extends AbstractTopology { ...@@ -501,7 +501,7 @@ public class ServiceTopology extends AbstractTopology {
if (node != null) { if (node != null) {
if (StringUtils.isEmpty(node.getClientProperty("plugin").toString())) { if (StringUtils.isEmpty(node.getClientProperty("plugin").toString())) {
JBasicOptionPane.showMessageDialog(HandleManager.getFrame(ServiceTopology.this), "该服务不能执行执行灰度路由", SwingLocale.getString("warning"), JBasicOptionPane.WARNING_MESSAGE); JBasicOptionPane.showMessageDialog(HandleManager.getFrame(ServiceTopology.this), ConsoleLocale.getString("node_not_for_gray_router"), SwingLocale.getString("warning"), JBasicOptionPane.WARNING_MESSAGE);
return; return;
} }
...@@ -542,7 +542,7 @@ public class ServiceTopology extends AbstractTopology { ...@@ -542,7 +542,7 @@ public class ServiceTopology extends AbstractTopology {
if (group != null) { if (group != null) {
if (StringUtils.isEmpty(group.getClientProperty("plugin").toString())) { if (StringUtils.isEmpty(group.getClientProperty("plugin").toString())) {
JBasicOptionPane.showMessageDialog(HandleManager.getFrame(ServiceTopology.this), "该服务集群不能刷新灰度状态", SwingLocale.getString("warning"), JBasicOptionPane.WARNING_MESSAGE); JBasicOptionPane.showMessageDialog(HandleManager.getFrame(ServiceTopology.this), ConsoleLocale.getString("group_not_for_refresh_gray_state"), SwingLocale.getString("warning"), JBasicOptionPane.WARNING_MESSAGE);
return; return;
} }
...@@ -550,7 +550,7 @@ public class ServiceTopology extends AbstractTopology { ...@@ -550,7 +550,7 @@ public class ServiceTopology extends AbstractTopology {
if (node != null) { if (node != null) {
if (StringUtils.isEmpty(node.getClientProperty("plugin").toString())) { if (StringUtils.isEmpty(node.getClientProperty("plugin").toString())) {
JBasicOptionPane.showMessageDialog(HandleManager.getFrame(ServiceTopology.this), "该服务不能刷新灰度状态", SwingLocale.getString("warning"), JBasicOptionPane.WARNING_MESSAGE); JBasicOptionPane.showMessageDialog(HandleManager.getFrame(ServiceTopology.this), ConsoleLocale.getString("node_not_for_refresh_gray_state"), SwingLocale.getString("warning"), JBasicOptionPane.WARNING_MESSAGE);
return; return;
} }
...@@ -609,8 +609,8 @@ public class ServiceTopology extends AbstractTopology { ...@@ -609,8 +609,8 @@ public class ServiceTopology extends AbstractTopology {
versionTabbedPane = new JBasicTabbedPane(); versionTabbedPane = new JBasicTabbedPane();
versionTabbedPane.setPreferredSize(new Dimension(versionTabbedPane.getPreferredSize().width, 75)); versionTabbedPane.setPreferredSize(new Dimension(versionTabbedPane.getPreferredSize().width, 75));
versionTabbedPane.addTab("灰度(动态)版本", dynamicVersionPanel, "灰度(动态)版本"); versionTabbedPane.addTab(ConsoleLocale.getString("label_dynamic_version"), dynamicVersionPanel, ConsoleLocale.getString("label_dynamic_version"));
versionTabbedPane.addTab("初始(本地)版本", localVersionPanel, "初始(本地)版本"); versionTabbedPane.addTab(ConsoleLocale.getString("label_local_version"), localVersionPanel, ConsoleLocale.getString("label_local_version"));
updateVersionButton = new JClassicButton(createUpdateVersionAction()); updateVersionButton = new JClassicButton(createUpdateVersionAction());
updateVersionButton.setPreferredSize(new Dimension(updateVersionButton.getPreferredSize().width, 30)); updateVersionButton.setPreferredSize(new Dimension(updateVersionButton.getPreferredSize().width, 30));
...@@ -626,11 +626,11 @@ public class ServiceTopology extends AbstractTopology { ...@@ -626,11 +626,11 @@ public class ServiceTopology extends AbstractTopology {
JPanel layoutPanel = new JPanel(); JPanel layoutPanel = new JPanel();
layoutPanel.setLayout(new FiledLayout(FiledLayout.COLUMN, FiledLayout.FULL, 5)); layoutPanel.setLayout(new FiledLayout(FiledLayout.COLUMN, FiledLayout.FULL, 5));
layoutPanel.add(new JLabel("灰度版本,输入的格式为[dynamicVersion]或者[dynamicVersion];[localVersion],例如1.1或者1.1;1.0,前者直接更新灰度版本为1.1,后者只是把满足初始版本为1.0条件的服务更新灰度版本为1.1", IconFactory.getSwingIcon("question_message.png"), SwingConstants.LEADING)); layoutPanel.add(new JLabel(ConsoleLocale.getString("description_gray_version"), IconFactory.getSwingIcon("question_message.png"), SwingConstants.LEADING));
layoutPanel.add(toolBar); layoutPanel.add(toolBar);
JPanel panel = new JPanel(); JPanel panel = new JPanel();
panel.setBorder(UIUtil.createTitledBorder("版本灰度")); panel.setBorder(UIUtil.createTitledBorder(ConsoleLocale.getString("title_gray_version_operation")));
panel.setLayout(new BorderLayout()); panel.setLayout(new BorderLayout());
panel.add(versionTabbedPane, BorderLayout.CENTER); panel.add(versionTabbedPane, BorderLayout.CENTER);
panel.add(layoutPanel, BorderLayout.SOUTH); panel.add(layoutPanel, BorderLayout.SOUTH);
...@@ -645,8 +645,8 @@ public class ServiceTopology extends AbstractTopology { ...@@ -645,8 +645,8 @@ public class ServiceTopology extends AbstractTopology {
localRuleTextArea.setEditable(false); localRuleTextArea.setEditable(false);
ruleTabbedPane = new JBasicTabbedPane(); ruleTabbedPane = new JBasicTabbedPane();
ruleTabbedPane.addTab("灰度(动态)规则", new JBasicScrollPane(dynamicRuleTextArea), "灰度(动态)规则"); ruleTabbedPane.addTab(ConsoleLocale.getString("label_dynamic_rule"), new JBasicScrollPane(dynamicRuleTextArea), ConsoleLocale.getString("label_dynamic_rule"));
ruleTabbedPane.addTab("初始(本地)规则", new JBasicScrollPane(localRuleTextArea), "初始(本地)规则"); ruleTabbedPane.addTab(ConsoleLocale.getString("label_local_rule"), new JBasicScrollPane(localRuleTextArea), ConsoleLocale.getString("label_local_rule"));
updateRuleButton = new JClassicButton(createUpdateRuleAction()); updateRuleButton = new JClassicButton(createUpdateRuleAction());
updateRuleButton.setPreferredSize(new Dimension(updateRuleButton.getPreferredSize().width, 30)); updateRuleButton.setPreferredSize(new Dimension(updateRuleButton.getPreferredSize().width, 30));
...@@ -661,7 +661,7 @@ public class ServiceTopology extends AbstractTopology { ...@@ -661,7 +661,7 @@ public class ServiceTopology extends AbstractTopology {
ButtonManager.updateUI(toolBar); ButtonManager.updateUI(toolBar);
JPanel panel = new JPanel(); JPanel panel = new JPanel();
panel.setBorder(UIUtil.createTitledBorder("规则灰度")); panel.setBorder(UIUtil.createTitledBorder(ConsoleLocale.getString("title_gray_rule_operation")));
panel.setLayout(new BorderLayout()); panel.setLayout(new BorderLayout());
panel.add(ruleTabbedPane, BorderLayout.CENTER); panel.add(ruleTabbedPane, BorderLayout.CENTER);
panel.add(toolBar, BorderLayout.SOUTH); panel.add(toolBar, BorderLayout.SOUTH);
...@@ -682,13 +682,13 @@ public class ServiceTopology extends AbstractTopology { ...@@ -682,13 +682,13 @@ public class ServiceTopology extends AbstractTopology {
dynamicVersionTextField.setText(""); dynamicVersionTextField.setText("");
localVersionTextField.setText(""); localVersionTextField.setText("");
updateVersionButton.setText("批量更新灰度版本"); updateVersionButton.setText(ConsoleLocale.getString("button_batch_update_version"));
clearVersionButton.setText("批量清除灰度版本"); clearVersionButton.setText(ConsoleLocale.getString("button_batch_clear_version"));
dynamicRuleTextArea.setText(""); dynamicRuleTextArea.setText("");
localRuleTextArea.setText(""); localRuleTextArea.setText("");
updateRuleButton.setText("批量更新灰度规则"); updateRuleButton.setText(ConsoleLocale.getString("button_batch_update_rule"));
clearRuleButton.setText("批量清除灰度规则"); clearRuleButton.setText(ConsoleLocale.getString("button_batch_clear_rule"));
} }
public void setGray(TNode node) { public void setGray(TNode node) {
...@@ -697,31 +697,31 @@ public class ServiceTopology extends AbstractTopology { ...@@ -697,31 +697,31 @@ public class ServiceTopology extends AbstractTopology {
InstanceEntity instance = (InstanceEntity) node.getUserObject(); InstanceEntity instance = (InstanceEntity) node.getUserObject();
if (versionTabbedPane.getTabCount() == 1) { if (versionTabbedPane.getTabCount() == 1) {
versionTabbedPane.addTab("初始(本地)版本", localVersionPanel, "初始(本地)版本"); versionTabbedPane.addTab(ConsoleLocale.getString("label_local_version"), localVersionPanel, ConsoleLocale.getString("label_local_version"));
} }
if (ruleTabbedPane.getTabCount() == 1) { if (ruleTabbedPane.getTabCount() == 1) {
ruleTabbedPane.addTab("初始(本地)规则", new JBasicScrollPane(localRuleTextArea), "初始(本地)规则"); ruleTabbedPane.addTab(ConsoleLocale.getString("label_local_rule"), new JBasicScrollPane(localRuleTextArea), ConsoleLocale.getString("label_local_rule"));
} }
dynamicVersionTextField.setText(instance.getDynamicVersion()); dynamicVersionTextField.setText(instance.getDynamicVersion());
localVersionTextField.setText(instance.getVersion()); localVersionTextField.setText(instance.getVersion());
updateVersionButton.setText("更新灰度版本"); updateVersionButton.setText(ConsoleLocale.getString("button_update_version"));
clearVersionButton.setText("清除灰度版本"); clearVersionButton.setText(ConsoleLocale.getString("button_clear_version"));
dynamicRuleTextArea.setText(instance.getDynamicRule()); dynamicRuleTextArea.setText(instance.getDynamicRule());
localRuleTextArea.setText(instance.getRule()); localRuleTextArea.setText(instance.getRule());
updateRuleButton.setText("更新灰度规则"); updateRuleButton.setText(ConsoleLocale.getString("button_update_rule"));
clearRuleButton.setText("清除灰度规则"); clearRuleButton.setText(ConsoleLocale.getString("button_clear_rule"));
} }
private JSecurityAction createUpdateVersionAction() { private JSecurityAction createUpdateVersionAction() {
JSecurityAction action = new JSecurityAction("更新灰度版本", ConsoleIconFactory.getSwingIcon("save.png"), "更新灰度版本") { JSecurityAction action = new JSecurityAction(ConsoleLocale.getString("button_update_version"), ConsoleIconFactory.getSwingIcon("save.png"), ConsoleLocale.getString("button_update_version")) {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
public void execute(ActionEvent e) { public void execute(ActionEvent e) {
String dynamicVersion = dynamicVersionTextField.getText(); String dynamicVersion = dynamicVersionTextField.getText();
if (StringUtils.isEmpty(dynamicVersion)) { if (StringUtils.isEmpty(dynamicVersion)) {
JBasicOptionPane.showMessageDialog(HandleManager.getFrame(ServiceTopology.this), "灰度版本不能为空", SwingLocale.getString("warning"), JBasicOptionPane.WARNING_MESSAGE); JBasicOptionPane.showMessageDialog(HandleManager.getFrame(ServiceTopology.this), ConsoleLocale.getString("gray_version_not_null"), SwingLocale.getString("warning"), JBasicOptionPane.WARNING_MESSAGE);
return; return;
} }
...@@ -767,7 +767,7 @@ public class ServiceTopology extends AbstractTopology { ...@@ -767,7 +767,7 @@ public class ServiceTopology extends AbstractTopology {
} }
private JSecurityAction createClearVersionAction() { private JSecurityAction createClearVersionAction() {
JSecurityAction action = new JSecurityAction("清除灰度版本", ConsoleIconFactory.getSwingIcon("paint.png"), "清除灰度版本") { JSecurityAction action = new JSecurityAction(ConsoleLocale.getString("button_clear_version"), ConsoleIconFactory.getSwingIcon("paint.png"), ConsoleLocale.getString("button_clear_version")) {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
public void execute(ActionEvent e) { public void execute(ActionEvent e) {
...@@ -812,13 +812,13 @@ public class ServiceTopology extends AbstractTopology { ...@@ -812,13 +812,13 @@ public class ServiceTopology extends AbstractTopology {
} }
private JSecurityAction createUpdateRuleAction() { private JSecurityAction createUpdateRuleAction() {
JSecurityAction action = new JSecurityAction("更新灰度规则", ConsoleIconFactory.getSwingIcon("save.png"), "更新灰度规则") { JSecurityAction action = new JSecurityAction(ConsoleLocale.getString("button_update_rule"), ConsoleIconFactory.getSwingIcon("save.png"), ConsoleLocale.getString("button_update_rule")) {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
public void execute(ActionEvent e) { public void execute(ActionEvent e) {
String dynamicRule = dynamicRuleTextArea.getText(); String dynamicRule = dynamicRuleTextArea.getText();
if (StringUtils.isEmpty(dynamicRule)) { if (StringUtils.isEmpty(dynamicRule)) {
JBasicOptionPane.showMessageDialog(HandleManager.getFrame(ServiceTopology.this), "灰度规则不能为空", SwingLocale.getString("warning"), JBasicOptionPane.WARNING_MESSAGE); JBasicOptionPane.showMessageDialog(HandleManager.getFrame(ServiceTopology.this), ConsoleLocale.getString("gray_rule_not_null"), SwingLocale.getString("warning"), JBasicOptionPane.WARNING_MESSAGE);
return; return;
} }
...@@ -864,7 +864,7 @@ public class ServiceTopology extends AbstractTopology { ...@@ -864,7 +864,7 @@ public class ServiceTopology extends AbstractTopology {
} }
private JSecurityAction createClearRuleAction() { private JSecurityAction createClearRuleAction() {
JSecurityAction action = new JSecurityAction("清除灰度规则", ConsoleIconFactory.getSwingIcon("paint.png"), "清除灰度规则") { JSecurityAction action = new JSecurityAction(ConsoleLocale.getString("button_clear_rule"), ConsoleIconFactory.getSwingIcon("paint.png"), ConsoleLocale.getString("button_clear_rule")) {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
public void execute(ActionEvent e) { public void execute(ActionEvent e) {
......
...@@ -15,8 +15,33 @@ execute_router=执行路由 ...@@ -15,8 +15,33 @@ execute_router=执行路由
clear_router=清除路由 clear_router=清除路由
router_path_invalid=路由路径不能为空 router_path_invalid=路由路径不能为空
title_gray_version_operation=灰度版本操作
title_gray_rule_operation=灰度规则操作
label_dynamic_version=灰度(动态)版本
label_local_version=初始(本地)版本
label_dynamic_rule=灰度(动态)规则
label_local_rule=初始(本地)规则
button_update_version=更新灰度版本
button_clear_version=清除灰度版本
button_batch_update_version=批量更新灰度版本
button_batch_clear_version=批量清除灰度版本
button_update_rule=更新灰度规则
button_clear_rule=清除灰度规则
button_batch_update_rule=批量更新灰度规则
button_batch_clear_rule=批量清除灰度规则
description_gray_version=灰度版本,输入的格式为[dynamicVersion]或者[dynamicVersion];[localVersion],例如1.1或者1.1;1.0,前者直接更新灰度版本为1.1,后者只是把满足初始版本为1.0条件的服务更新灰度版本为1.1
gray_version_not_null=灰度版本不能为空
gray_rule_not_null=灰度规则不能为空
execute_result=执行结果
get_service_instances_failure=获取服务和实例列表失败 get_service_instances_failure=获取服务和实例列表失败
query_data_failure=查询数据失败,可能相关实例已下线 query_data_failure=查询数据失败,可能相关实例已下线
group_not_for_gray_release=该服务集群不能执行灰度发布
node_not_for_gray_release=该服务不能执行灰度发布
node_not_for_gray_router=该服务不能执行执行灰度路由
group_not_for_refresh_gray_state=该服务集群不能刷新灰度状态
node_not_for_refresh_gray_state=该服务不能刷新灰度状态
select_a_group=请选择一个服务集群 select_a_group=请选择一个服务集群
select_a_node=请选择一个服务 select_a_node=请选择一个服务
......
...@@ -15,8 +15,33 @@ execute_router=\u6267\u884c\u8def\u7531 ...@@ -15,8 +15,33 @@ execute_router=\u6267\u884c\u8def\u7531
clear_router=\u6e05\u9664\u8def\u7531 clear_router=\u6e05\u9664\u8def\u7531
router_path_invalid=\u8def\u7531\u8def\u5f84\u4e0d\u80fd\u4e3a\u7a7a router_path_invalid=\u8def\u7531\u8def\u5f84\u4e0d\u80fd\u4e3a\u7a7a
title_gray_version_operation=\u7070\u5ea6\u7248\u672c\u64cd\u4f5c
title_gray_rule_operation=\u7070\u5ea6\u89c4\u5219\u64cd\u4f5c
label_dynamic_version=\u7070\u5ea6\uff08\u52a8\u6001\uff09\u7248\u672c
label_local_version=\u521d\u59cb\uff08\u672c\u5730\uff09\u7248\u672c
label_dynamic_rule=\u7070\u5ea6\uff08\u52a8\u6001\uff09\u89c4\u5219
label_local_rule=\u521d\u59cb\uff08\u672c\u5730\uff09\u89c4\u5219
button_update_version=\u66f4\u65b0\u7070\u5ea6\u7248\u672c
button_clear_version=\u6e05\u9664\u7070\u5ea6\u7248\u672c
button_batch_update_version=\u6279\u91cf\u66f4\u65b0\u7070\u5ea6\u7248\u672c
button_batch_clear_version=\u6279\u91cf\u6e05\u9664\u7070\u5ea6\u7248\u672c
button_update_rule=\u66f4\u65b0\u7070\u5ea6\u89c4\u5219
button_clear_rule=\u6e05\u9664\u7070\u5ea6\u89c4\u5219
button_batch_update_rule=\u6279\u91cf\u66f4\u65b0\u7070\u5ea6\u89c4\u5219
button_batch_clear_rule=\u6279\u91cf\u6e05\u9664\u7070\u5ea6\u89c4\u5219
description_gray_version=\u7070\u5ea6\u7248\u672c\uff0c\u8f93\u5165\u7684\u683c\u5f0f\u4e3a[dynamicVersion]\u6216\u8005[dynamicVersion];[localVersion]\uff0c\u4f8b\u59821.1\u6216\u80051.1;1.0\uff0c\u524d\u8005\u76f4\u63a5\u66f4\u65b0\u7070\u5ea6\u7248\u672c\u4e3a1.1\uff0c\u540e\u8005\u53ea\u662f\u628a\u6ee1\u8db3\u521d\u59cb\u7248\u672c\u4e3a1.0\u6761\u4ef6\u7684\u670d\u52a1\u66f4\u65b0\u7070\u5ea6\u7248\u672c\u4e3a1.1
gray_version_not_null=\u7070\u5ea6\u7248\u672c\u4e0d\u80fd\u4e3a\u7a7a
gray_rule_not_null=\u7070\u5ea6\u89c4\u5219\u4e0d\u80fd\u4e3a\u7a7a
execute_result=\u6267\u884c\u7ed3\u679c
get_service_instances_failure=\u83b7\u53d6\u670d\u52a1\u548c\u5b9e\u4f8b\u5217\u8868\u5931\u8d25 get_service_instances_failure=\u83b7\u53d6\u670d\u52a1\u548c\u5b9e\u4f8b\u5217\u8868\u5931\u8d25
query_data_failure=\u67e5\u8be2\u6570\u636e\u5931\u8d25\uff0c\u53ef\u80fd\u76f8\u5173\u5b9e\u4f8b\u5df2\u4e0b\u7ebf query_data_failure=\u67e5\u8be2\u6570\u636e\u5931\u8d25\uff0c\u53ef\u80fd\u76f8\u5173\u5b9e\u4f8b\u5df2\u4e0b\u7ebf
group_not_for_gray_release=\u8be5\u670d\u52a1\u96c6\u7fa4\u4e0d\u80fd\u6267\u884c\u7070\u5ea6\u53d1\u5e03
node_not_for_gray_release=\u8be5\u670d\u52a1\u4e0d\u80fd\u6267\u884c\u7070\u5ea6\u53d1\u5e03
node_not_for_gray_router=\u8be5\u670d\u52a1\u4e0d\u80fd\u6267\u884c\u6267\u884c\u7070\u5ea6\u8def\u7531
group_not_for_refresh_gray_state=\u8be5\u670d\u52a1\u96c6\u7fa4\u4e0d\u80fd\u5237\u65b0\u7070\u5ea6\u72b6\u6001
node_not_for_refresh_gray_state=\u8be5\u670d\u52a1\u4e0d\u80fd\u5237\u65b0\u7070\u5ea6\u72b6\u6001
select_a_group=\u8bf7\u9009\u62e9\u4e00\u4e2a\u670d\u52a1\u96c6\u7fa4 select_a_group=\u8bf7\u9009\u62e9\u4e00\u4e2a\u670d\u52a1\u96c6\u7fa4
select_a_node=\u8bf7\u9009\u62e9\u4e00\u4e2a\u670d\u52a1 select_a_node=\u8bf7\u9009\u62e9\u4e00\u4e2a\u670d\u52a1
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment